【问题标题】:Passing data from View to Controller将数据从视图传递到控制器
【发布时间】:2009-01-12 13:22:08
【问题描述】:

在 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 发送到控制器? 或者我如何通过按下按钮发送一个数字索引?也许有一个隐藏的领域?

【问题讨论】:

    标签: c# .net asp.net-mvc view controller


    【解决方案1】:

    最简单的选项可能是隐藏输入:

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

    (相应地命名;在每种形式中)

    然后,这两个控制器将采用一个名为“key”的参数(重命名以适应)。如果要从多个输入中解析对象,则需要 ModelBinder。当然,除了 2*n 表单,您可以考虑使用基于查询字符串的 url,或者使用 jQuery(或其他脚本助手)之类的东西来提交数据而不需要表单(如果脚本可用)。

    【讨论】:

    • 好的。我会尝试的,但我无法在受控端抓住传递的项目?参数应该是什么类型?我现在试图只传递字符串....
    【解决方案2】:

    考虑使用 ActionLink 并构造它以包含被批准成员的 ID,而不是使用 HTML 按钮。另一种选择是有一个复选框(其值是被批准的成员的 id),管理员可以为每个要批准的成员选择一个复选框,一个类似的用于拒绝,一个用于整个表单的每个批准/拒绝按钮。

    【讨论】:

      【解决方案3】:

      回答我自己和其他 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 方法中调试应用程序为 name 参数提供了很好的“Barrack”字符串,但 Person 参数为 null。

      我也理解好心的评论者试图解释的意思:向控制器发送简单的数据类型(如字符串和整数)很容易,但复杂的类型(如我的 Person 对象)需要其他东西。

      基本上传递一个 int 对我来说就足够了。这里最困难的部分是找出设置 ActionLink 的正确方法。

      干杯, 绒球

      【讨论】:

      • 虽然这很旧,但我想补充一点,可以使用序列化来实现将复杂对象从视图传递到控制器。看看来自 SO 的这个问题,它就是例证 stackoverflow.com/questions/1002180/…
      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2017-11-30
      • 2011-09-09
      • 1970-01-01
      • 2017-01-29
      相关资源
      最近更新 更多