Я использую ASP.NET MVC Preview 4 и хотел бы знать, как использовать механизм маршрутизации для отправки форм.
Например, у меня есть такой маршрут:
routes.MapRoute(
"TestController-TestAction",
"TestController.mvc/TestAction/{paramName}",
new { controller = "TestController", action = "TestAction", id = "TestTopic" }
);
И объявление формы, которое выглядит так:
<% using (Html.Form("TestController", "TestAction", FormMethod.Get))
{ %>
<input type = "text" name = "paramName" />
<input type = "submit" />
<% } %>
который отображает:
<form method = "get" action = "/TestController.mvc/TestAction">
<input type = "text" name = "paramName" />
<input type = "submit" />
</form>
Результирующий URL-адрес отправки формы:
localhost/TestController.mvc/TestAction?paramName=value
Есть ли способ получить этот маршрут отправки формы по желаемому URL-адресу:
localhost/TestController.mvc/TestAction/value
Единственные решения, которые я могу придумать, - это создать отдельное действие, которое просто проверяет параметры запроса, или использовать Javascript.





В своем маршруте избавьтесь от части URL-адреса {paramName}. Должен быть:
TestController.mvc / TestAction
Поскольку это URL-адрес, на который вы хотите направить запрос. Ваша форма будет размещена по этому URL-адресу. Опубликованные значения формы автоматически сопоставляются с параметрами метода действия, поэтому не беспокойтесь о том, что эти данные не будут переданы вашему методу действия.
Насколько я понимаю, так работает HTML. Если вы сделаете <form url = "foo" method = "get"> и опубликуете форму, то форма опубликует foo?
param1=value1&...¶mn=valuen
Это не имеет ничего общего с MVC.
Кроме того, какую часть REST нарушает этот URL-адрес? Это не URL-адрес симпатичный, но по строгому определению REST он может быть RESTful. REST не указывает, что параметры запроса должны находиться в сегменте URL-адреса. И в данном случае это параметры запроса.
Решение:
public ActionResult TestAction(string paramName)
{
if (!String.IsNullOrEmpty(Request["paramName"]))
{
return RedirectToAction("TestAction", new { paramName = Request["paramName"]});
}
/* ... */
}
@ Маслоу, да! редирект 302 будет всегда
Да ты прав - спасибо. Размышляя над этим, я даже не уверен, о чем я думал - может быть, просто для того, чтобы приложение MVC перенаправляло на новый красивый URL-адрес после отправки формы. Более поздние атрибуты GET / POST помогают.