ASP.NET MVC глотает отправку значений? - PullRequest
3 голосов
/ 14 ноября 2009

У меня есть одна форма в ASP.NET MVC (v1), которая имеет 2 кнопки ввода. Каждая кнопка отправки должна содержаться в этой единственной форме, и мне нужно знать, какую из них нажал пользователь.

Я знаю о том, как проверять значения FormCollection, которые будут возвращаться в зависимости от нажатой кнопки. Например, если у меня есть и пользователь нажимает кнопку Button2, я могу сказать, что Request.Form ["Button2"]! = Null, и это будет иметь значение true, в этом случае я знаю, что пользователь нажал эту кнопку. *

Однако, это не работает для меня. Значения всех моих кнопок равны нулю, поскольку ни одна из них не содержится в значениях Request.Form. Есть ли ошибка в ASP.NET MVC, которая поглощает эти значения?

Вот мой код формы:

<% using (Html.BeginForm()) {%>

    <% Html.RenderPartial( "EditAreaControl", Model ); %>

    <div class="form-layout-command-container">
        <div class="form-layout-command-area-alpha"><button type="submit" name="submit1" value="Save">Save</button></div>
        <div class="form-layout-command-area-alpha"><button type="submit" name="submit2" value="SaveAndCopy">Save and Create Copy</button></div>
        <div class="form-layout-command-area-beta"><%= Html.ActionLink("Cancel", "list") %></div>
    </div>

<% } %>

Вот код моего контроллера:

[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Add(FormCollection values )
{
   if (values["submit1"] != null)
        // always false
   if (values["submit2"] != null)
        // always false as well
}

Ответы [ 4 ]

6 голосов
/ 14 ноября 2009

Из w3schools :

Важное замечание: Если вы используете элемент кнопки в форме HTML, разные браузеры будут отправлять разные значения. Internet Explorer будет отправлять текст между тегами и, а другие браузеры будут отправлять содержимое значения приписывать. Используйте элемент ввода для создания кнопок в форме HTML.

Кажется, это не стандартизировано. Вы должны придерживаться

<input type="submit" name="submitButton" value="Save" />
<input type="submit" name="submitButton" value="Cancel" />
2 голосов
/ 14 ноября 2009

Я бы использовал ввод типа submit вместо кнопок. Не входные данные могут не передаваться обратно в форме сообщения или, по крайней мере, могут передаваться обратно непоследовательно. Обратите внимание, что они могут иметь одинаковые имена с разными значениями, поэтому вы можете использовать один и тот же параметр для любой кнопки, отправляющей форму.

<input type="submit" name="submitButton" value="Save" />
<input type="submit" name="submitButton" value="SaveAndCopy" />


public ActionResult Save( string submitButton, ... )
{
     if (submitButton == "Save")
     {
        ...
     }
     else if (submitButton == "SaveAndCopy")
     {
        ...
     }

     ....
}
1 голос
/ 16 ноября 2009

Используя Firebug, я обнаружил, что кнопки отправки не отправляются в ответе, и поэтому я не могу многое сделать на стороне MVC. Я решил использовать хак на стороне клиента, чтобы заполнить скрытое поле ввода на стороне клиента, которое будет передаваться значениям контроллера.

Я изменил кнопки ввода на:

<input type="submit" value="Save" onclick="actions.copyValues($(this), $('#submitAction'));" />
<input type="submit" value="Save and Copy" onclick="actions.copyValues($(this), $('#submitAction'));" />
<input type="hidden" id="submitAction" name="submitAction" />

Скрипт jquery просто копирует значения:

Actions.prototype.copyValues = function(from, to) {
            $(to).val($(from).val());
        };

Затем действие контроллера ищет скрытые входные значения:

var request = HttpContext.Request;
return request.Form["submitAction"];

Это решает проблему сверху, но я понимаю, что это не так чисто.

0 голосов
/ 14 ноября 2009

Поместите их в две разные формы, и вы будете знать, какая из них отправлена, в зависимости от того, какое действие было вызвано на контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...