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





Самым простым вариантом, вероятно, будет скрытый ввод:
<input type = "hidden" value = "<%=mm.Key%>" name = "key" id = "key" />
(назовите соответственно; в каждой форме)
Затем два контроллера будут принимать аргумент под названием «ключ» (переименовать в соответствии с требованиями). Если вы хотите проанализировать объект с нескольких входов, вам понадобится ModelBinder. Конечно, вместо форм 2 * n вы можете рассмотреть либо URL-адреса на основе строки запроса, либо использовать что-то вроде jQuery (или какой-либо другой помощник скрипта) для отправки данных без необходимости форм (если скрипт доступен).
Вместо использования кнопки HTML рассмотрите возможность использования ActionLink и создайте его, чтобы включить идентификатор утверждаемого члена. Другой альтернативой было бы наличие флажка (значение которого представляет собой идентификатор утверждаемого члена), который администратор может выбрать для каждого члена, подлежащего утверждению, и аналогичный для отклонения и по одной кнопке утверждения / отклонения для всей формы.
Отвечая себе и другим новичкам 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.
Ваше здоровье, Пом
Хотя это и устарело, я просто хотел бы добавить, что передача сложных объектов из представления в контроллер может быть достигнута с помощью сериализации. Посмотрите на этот вопрос от SO, который иллюстрирует это stackoverflow.com/questions/1002180/….
ОК. Я пробовал это, но не могу получить пройденный элемент на контролируемой стороне? Какого типа должен быть аргумент? Я пытаюсь передать только строку ...