ASP.Net В MVC 3 URL-Адрес.Метод Action использует значения параметров из предыдущего запроса

когда URL-адреса генерируются с помощью Url.Action helper, если страница содержит строку, похожую на

@URL-адрес.Действие ("Редактировать","Студент")

ожидается создание url-адреса, например domain/student/edit и работает, как ожидалось. Но если запрошенный url-адрес содержит некоторые параметры, например domain/student/edit/210 приведенный выше код использует эти параметры предыдущего запроса и создает что-то подобное, хотя я не предоставил такой параметр Action метод.

короче говоря, если запрошенный url-адрес содержит какие-либо параметры, любые автоматически сгенерированные ссылки страницы (обслуживаемые для этого запроса) будут включать эти параметры, а также независимо от того, указываю ли я их или нет в Url.Action метод.

что происходит?

4 ответов


странно, похоже, не может воспроизвести проблему:

public class HomeController : Controller
{
    public ActionResult Index(string id)
    {
        return View();
    }

    public ActionResult About(string id)
    {
        return View();
    }
}

и внутри Index.cshtml:

@Url.Action("About", "Home")

теперь, когда я прошу /home/index/123 помощник url генерирует /home/about как и ожидалось. Никаких параметров призрака. Так чем же отличается ваш сценарий?


обновление:

теперь, когда вы прояснили свой сценарий, кажется, что у вас есть следующее:

public class HomeController : Controller
{
    public ActionResult Index(string id)
    {
        return View();
    }
}

и внутри Index.cshtml вы пытаетесь использовать:

@Url.Action("Index", "Home")

если вы спрашиваете /home/index/123 это создает /home/index/123 вместо ожидаемого /home/index (или просто / С учетом значений по умолчанию).

это поведение по дизайну. Если вы хотите изменить его, вам придется написать свой собственный помощник, который игнорирует текущие данные о маршруте. Вот как это может выглядеть:

@UrlHelper.GenerateUrl(
    "Default", 
    "index", 
    "home", 
    null, 
    Url.RouteCollection, 
    // That's the important part and it is where we kill the current RouteData
    new RequestContext(Html.ViewContext.HttpContext, new RouteData()), 
    false
)

это создаст правильный url, который вы ожидали. Конечно, это ужасно. Я бы рекомендовал вам инкапсулировать его в многоразовый помощник.


используйте ответ Дарина из этого аналогичный вопрос.

@Url.Action("Edit","Student", new { ID = "" })

используйте перегрузку ActionLink, которая использует параметры и поставляет null


вы можете зарегистрировать пользовательский маршрут для этого действия, например:

routes.MapRoute("Domain_EditStudentDefault",
            "student/edit",
            new { 
                controller = MVC.Student.Name, 
                action = MVC.Student.ActionNames.Edit,
                ID = UrlParameter.Optional
            },
            new object(),
            new[] { "MySolution.Web.Controllers" }
        );

затем вы могли бы использовать url.RouteUrl("Domain_EditStudentDefault") url routeurl helper переопределить только routeName параметр, который генерирует url без параметров.