У меня такое чувство, что я слишком "зацикливаюсь" на этом, но я все равно спрошу. У меня есть форма в проекте ASP.NET MVC, в которой есть несколько полей ввода и две кнопки. Одна кнопка используется для «фильтрации» одного из списков. Другой используется для отправки формы. Моя точка зрения выглядит примерно так:
<%using (Html.BeginForm())
{%>
<%=Html.TextBox("SearchItems") %>
<input type = "submit" name = "Command" value = "Find" />
<%=Html.ListBox("SelectedItems", new MultiSelectList(model.AvailableItems,"Id", "Name", model.SelectedItems))%>
//Some other form fields.
<input type = "submit" name = "Command" value = "Send" />
<%} %>
Мое действие выглядит примерно так:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index([Bind(Prefix = "")]SendMessageRequest model)
{
if (model.Command == "Find")
return SearchItems(model);
if (model.Command == "Send")
return Send(model);
throw new Exception("Invalid command.");
}
Это работает - контроллер выбирает правильное действие на основе нажатой кнопки. Однако это не идеально, потому что значение кнопки ввода также является отображаемым текстом. Если бы я хотел перевести это приложение, то действие сломалось бы. Чтобы обойти это, я могу использовать элемент <button>, который позволяет тексту и значению различаться. Однако это приложение предназначено для Pocket IE, и, очевидно, Pocket IE обрабатывает их по-другому - он отправляет значения оба для Command, что прерывает действие.
Поскольку это для Pocket IE, я также довольно ограничен в том, что я могу делать с помощью JavaScript. Ajax отсутствует, но я мог бы установить скрытое поле в кнопках onClick.
Итак, мой вопрос: как лучше всего разрешить одну форму с несколькими кнопками в представлении MVC? В качестве альтернативы, следует ли мне как-то разбить свое представление на несколько форм?





Нет необходимости в скрытом поле, вы можете настроить действие формы на событие нажатия кнопки.
JavaScript (в jQuery) выглядит примерно так:
$("#myForm").attr("action", "mvcaction");
$("#myForm").submit();
Вы можете заключить это в стандартную функцию, которая принимает параметр, например действие. Мы используем это для стандартных пунктов меню в объекте формы меню, это работает довольно хорошо.
Обновлено: Не уверен, что Pocket PC вообще обрабатывает JQuery, хотя, если это не так, должно быть возможно сделать это в обычном javascript.
Я бы предложил несколько форм с двумя разными действиями. Я думаю, что это также более проверено:
(c => c.Search(), FormMethod.Get); { %> Find (c => c.Send(), FormMethod.Post); { %> Sendили что-то типа того. Тогда в контроллере у вас есть 2 соответствующих действия. Это означает, что ответственность снята. В MVC у вас может быть несколько форм, в отличие от Webforms. Так что вы можете вырваться на свободу!
Проблема с этим подходом заключается в том, что в этом случае форма «Поиск» должна быть внутри, формой «Отправить», и все значения на странице должны сохраняться. В этом решении, если пользователь вводит что-то в форме отправки, а затем выполняет поиск, форма отправки теряет свое состояние (кроме FireFox).
Вот очень хорошая статья, описывающая все альтернативы для форм с несколькими кнопками: http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx
Лично я согласен с Odd, действия jQuery onclick кажутся лучшим вариантом.
Но тогда вы полагаетесь на JavaScript для управления поведением страницы. Страницы должны нормально работать с отключенным JavaScript, так что это было бы не идеально.
Приложение, которое я создаю, должно быть масштабно улучшено с помощью ajax, однако проблема с несколькими формами также возникла.
Мы обошли его с помощью метода $ .post () из библиотеки jQuery.
$("#update").click(function() {
$.post("/Register", { name: $("#firstName").val(),
surname: $("#surname").val(),
username: $("#email").val(),
accountName: $("#accountName").val(),
password: $("#password").val()
},
function(data) {
alert(data);
});
});
А кнопка отмены отправила обратно меньше значений.
$("#cancel").click(function() {
$.post("/Cancel", { username: $("#email").val(),
password: $("#password").val()
},
function(data) {
alert(data);
});
});
Хорошо, снова это зависит от включения javascript, но если вы собираетесь отключить javascript, вам лучше не использовать Интернет (и мое приложение, потому что оно будет тяжелым для js).
это также должно устранить проблему поддержки javascript