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 = "" })
вы можете зарегистрировать пользовательский маршрут для этого действия, например:
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 без параметров.