Передача данных из представления в контроллер - PullRequest
3 голосов
/ 12 января 2009

В приложении 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 из View на контроллер? Или как мне отправить, возможно, числовой индекс нажатием кнопки? Может со скрытым полем?

Ответы [ 3 ]

3 голосов
/ 12 января 2009

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

3 голосов
/ 12 января 2009

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

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

ВИД:

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

CONTROLLER:

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» для параметра name, но параметр Person в null.

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

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

Ура, П

3 голосов
/ 12 января 2009

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

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

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

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

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