MVC поддерживает RESTful URL, но HTML-формы по своей природе добавляют данные в значения строки запроса. Мое действие принимает «текст» в качестве строкового параметра. И моя форма:
<% using(Html.BeginForm("Action", "Controller")) { %>
<%= Html.TextBox("text") %>
<input type="submit" value="submit" />
<% } %>
Мое действие:
public ActionResult Action(string text)
{
...
return toInnocence;
}
Существует два разных URL, на которые может быть наложено действие:
~/Controller/Action/textvalue
благодаря вашей карте маршрутов {контроллер} / {действие} / {текст}
~/Controller/Action?text=textvalue
при отправке из формы
Мой вопрос:
Как я могу различить две формы и выполнить перенаправление в последнем случае? Вторая форма нарушает принцип RESTful. Какова лучшая практика там? Я не хочу запрашивать коллекцию RouteData.Values, потому что она нарушает всю цель преобразования параметров запроса в аргументы функции естественным и простым способом. Это очень простой сценарий, и я ожидаю, что MVC хорошо с этим справится.
Вторая форма не соответствует параметру «текст» в действии контроллера. Зачем? Как я могу создать перегруженные версии одного и того же действия? Нужно ли создавать новое действие и использовать его для отправки формы? Конечно, я могу обойти все это, но в то же время я боюсь пропустить где-то большую картину.
Похоже, что люди справляются с ними непринужденно, поэтому я чувствую, что я единственный, кто смущен значениями маршрута для строк запроса.
РЕДАКТИРОВАТЬ: Я посмотрел, как это делает Википедия. Он использует отдельные действия для «получателя формы» и фактического релакс-URL и перенаправляет от одного к другому по мере необходимости. Я думаю, это был бы лучший способ сделать это.