Как научиться перестать беспокоиться и любить формы ASP.NET MVC? - PullRequest
0 голосов
/ 15 декабря 2009

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, на которые может быть наложено действие:

  1. ~/Controller/Action/textvalue благодаря вашей карте маршрутов {контроллер} / {действие} / {текст}
  2. ~/Controller/Action?text=textvalue при отправке из формы

Мой вопрос:

Как я могу различить две формы и выполнить перенаправление в последнем случае? Вторая форма нарушает принцип RESTful. Какова лучшая практика там? Я не хочу запрашивать коллекцию RouteData.Values, потому что она нарушает всю цель преобразования параметров запроса в аргументы функции естественным и простым способом. Это очень простой сценарий, и я ожидаю, что MVC хорошо с этим справится.

Вторая форма не соответствует параметру «текст» в действии контроллера. Зачем? Как я могу создать перегруженные версии одного и того же действия? Нужно ли создавать новое действие и использовать его для отправки формы? Конечно, я могу обойти все это, но в то же время я боюсь пропустить где-то большую картину.

Похоже, что люди справляются с ними непринужденно, поэтому я чувствую, что я единственный, кто смущен значениями маршрута для строк запроса.

РЕДАКТИРОВАТЬ: Я посмотрел, как это делает Википедия. Он использует отдельные действия для «получателя формы» и фактического релакс-URL и перенаправляет от одного к другому по мере необходимости. Я думаю, это был бы лучший способ сделать это.

1 Ответ

3 голосов
/ 15 декабря 2009

По умолчанию ваш браузер помещает значения в форме GET в строку запроса. Они оба разрешат маршрут и перейдут к одному действию.

{ controller = "Controller", "Action", id = null, text = "textvalue" }

Из-за наличия маршрута по умолчанию это будет правильно разрешено.

Единственный способ, о котором я могу думать, - это изменить форму. Вместо отправки запроса «GET», отправьте как PUT, потому что вам не нужен POST (вы можете сделать это с JS, с дружественным понижением до POST) и перенаправьте на GET.

...