Передача данных из представления в контроллер

В приложении ASP.NET MVC я создаю логику, позволяющую администратору принимать или отклонять новых участников. Я показываю список участников и две кнопки «Принять» и «Отклонить», например:

<% foreach (var mm in (ViewData["pendingmembers"] as List<MyMember>)) %>
<% { %>
   <tr><td>Username:<%=mm.UserName %></td><td>
   <tr><td>Firstname:<%=mm.FirstName %></td><td>
   ...etc...
   <tr>
      <td>
      <% using (Html.BeginForm("AcceptPendingUser", "Admin"))
      { %>
          <input type="submit" value="Accept" />
      <% } %>
      </td>
      <td>
      <% using (Html.BeginForm("RejectPendingUser", "Admin"))
      { %>
        <input type="submit" value="Reject" />
      <% } %>
      </td>
    </tr>
<% } %>

Итак, список ожидающих обработки данных участника находится в списке объектов MyMember. Каждый объект MyMember будет распечатан, и для администратора настроены две кнопки, чтобы либо принять, либо отклонить ожидающего члена.

Затем в контроллере я разделяю обработку этих двух полей/форм ввода, например:

public ActionResult AcceptPendingUser()
{
   // TODO: Add code to save user into DB and send welcome email.
   return RedirectToAction("Index");
}

public ActionResult RejectPendingUser()
{
   // TODO: Add code to remove user from PendingUsers list and send rejection email.
   return RedirectToAction("Index");
}

Я хотел бы получить объект рядом с кнопкой, которую нажал пользователь. Как я могу отправить объект MyMember из представления в контроллер? Или как отправить числовой индекс нажатием кнопки? Может со скрытым полем?


person Pompair    schedule 12.01.2009    source источник


Ответы (3)


Самым простым вариантом, вероятно, будет скрытый ввод:

<input type="hidden" value="<%=mm.Key%>" name="key" id="key" />

(имя соответственно; в каждой форме)

Затем два контроллера будут принимать аргумент под названием «ключ» (переименовать в соответствии с требованиями). Если вы хотите проанализировать объект из нескольких входных данных, вам понадобится ModelBinder. Конечно, вместо форм 2 * n вы можете рассмотреть либо URL-адреса на основе строки запроса, либо использовать что-то вроде jQuery (или какой-либо другой вспомогательный скрипт) для отправки данных без использования форм (если скрипт доступен).

person Marc Gravell    schedule 12.01.2009
comment
ХОРОШО. Я попробую, но я не могу получить переданный предмет на контролируемой стороне? Какого типа должен быть аргумент? Я пытаюсь передать только строку в этот момент.... - person Pompair; 12.01.2009

Вместо использования HTML-кнопки рассмотрите возможность использования ActionLink и создайте ее, включив в нее идентификатор утверждаемого участника. Другой альтернативой может быть наличие флажка (значение которого является идентификатором утверждаемого участника), который администратор может выбрать для каждого участника, который должен быть утвержден, и аналогичный для отклонения и по одной кнопке утверждения/отклонения для всей формы.

person tvanfosson    schedule 12.01.2009

Отвечая себе и другим новичкам mvc:

Наконец-то я заработал с этим кодом:

ПОСМОТРЕТЬ:

 <%=Html.ActionLink(
     "Jump", 
     "Jump", 
     new { name=(ViewData["Person"] as Person).Name, 
     person=ViewData["Person"]}, 
     null) %>

КОНТРОЛЛЕР:

public ActionResult Index()
{
     ViewData["Title"] = "Home Page";
     ViewData["Message"] = "Welcome to ASP.NET MVC!";
     Person p = new Person();
     p.Name = "Barrack";
     p.Age = 35;
     ViewData["Person"] = p;
     return View();
}

public ActionResult Jump(string name, Person person)
{
    return View();
}

Отладка приложения в методе Jump дает мне красивую строку «Barrack» для параметра имени, но параметр Person имеет значение null.

Я также понимаю, что пытались объяснить добрые комментаторы: простые типы данных, такие как строки и целые числа, легко отправлять в контроллер, но сложные типы, такие как мой объект Person, требуют чего-то еще.

В основном передачи int для меня достаточно. Самым сложным здесь было выяснить, как правильно настроить ActionLink.

Привет, Пом

person Pompair    schedule 12.01.2009
comment
Хотя это устарело, я просто хотел бы добавить, что передача сложных объектов из представления в контроллер может быть достигнута с помощью сериализации. Посмотрите на этот вопрос из SO, который иллюстрирует его stackoverflow.com/questions/1002180/ . - person Hallaghan; 27.01.2011