Сопоставление отдельных кнопок в ASP.NET MVC View с действиями контроллера - PullRequest
9 голосов
/ 02 января 2009

У меня есть приложение, в котором мне нужно, чтобы пользователь мог обновлять или удалять строки данных из базы данных. Строки отображаются пользователю с помощью цикла foreach в файле .aspx моего представления. Каждая строка будет иметь два текстовых поля (txtName, txtDesc), кнопку обновления и кнопку удаления. В чем я не уверен, так как мне заставить кнопку обновления отправить сообщение контроллеру, для какой строки обновить? Я вижу пару способов сделать это:

  1. Поместите каждую строку в свой собственный тег формы, затем, когда кнопка обновления будет нажата, она отправит значения только для этой строки (также будет скрытое поле с rowId), и класс контроллера будет занимать все сообщения значения в качестве параметров для метода обновления на контроллере.
  2. Каким-то образом нужно, чтобы кнопка была написана таким образом, чтобы отправлять обратно значения только для этой строки с POST в контроллер.

Есть ли способ сделать это? Меня беспокоит одна вещь: если каждая строка имеет разные имена для своих элементов управления, назначенных ASP.NET (txtName1, txtDesc1, txtName2, txtDesc2), то как их значения будут сопоставлены с правильными параметрами метода Controller?

Ответы [ 3 ]

11 голосов
/ 02 января 2009

Вы можете использовать несколько форм и установить действие в форме следующим образом:

<form method="post" action="/YourController/YourAction/<%=rowId%>">

То есть у вас будет YourController/YourAction/1, YourController/YourAction/2 и так далее.

Нет необходимости давать разные имена различным текстовым полям, просто называйте их txtName, txtDesc и т. Д. (Или, что еще лучше, избавьтесь от этих префиксов txt). Поскольку они находятся в разных формах, они не будут смешиваться.

Затем на действии вы делаете что-то вроде

public ActionResult YourAction(int id, string username, string description)

Если имя пользователя, описание - это те же имена, которые вы использовали в элементах управления формы (поэтому они отображаются автоматически). Параметр id будет автоматически сопоставлен с номером, который вы указали в действии формы.

4 голосов
/ 30 мая 2010

Вы также можете иметь несколько «действительных имен» кнопок в форме, например:

<input type="submit" value="Save" name="btnSave" id="btnSave"/>
<input type="submit" value="Delete" name="btnDelete" id="btnDelete" /

и чем проверить, чтобы увидеть, что отправить вы получили. Для каждой формы может быть отправлено только одно действие отправки, поэтому все остальные кнопки отправки фактически не существовали:

if ( HttpContext.Request.Form["btnDelete"] != null ) {
    //Delete stuff
} elseif ( HttpContext.Request.Form["btnSave"] != null ) {
    //Update stuff
}

Я также думаю, что вы можете реализовать собственный ActionMethodSelectorAttribute, как здесь http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx (также перечисленный выше), чтобы иметь более чистый код.

0 голосов
/ 03 января 2009

Как сказал Родбв, вы хотите использовать отдельные <form> элементы.

Когда вы используете Asp.Net MVC или классический html (php, classic asp и т. Д.), Вы должны забыть способ обработки нажатий кнопок Asp.Net. Когда форма отправляется обратно на веб-сервер, сервер знает только о том, что «форма была отправлена ​​и содержала следующие элементы ввода».

Asp.net (стандарт) добавляет обертку вокруг многих стандартных действий обратной передачи html с использованием javascript (функция javascript __doPostback используется практически везде), и это добавляет информацию о том, какой элемент ввода формы вызвал обратную передачу, и доставляет ее в сервер в скрытой форме переменной. Вы могли бы подражать этому поведению, если бы вы действительно этого хотели, но я бы рекомендовал против этого.

Может показаться странным «засорять» страницу многими <form>, однако это будет означать, что обратная передача на сервер будет легче и должна заставить все работать немного быстрее для пользователя.

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