将视图中的数据传递给控制器​​

问题描述:

在ASP.NET MVC应用程序中,我正在让Admin接受或拒绝新成员的逻辑。我展示的成员列表和两个按钮接受和拒绝,像这样:将视图中的数据传递给控制器​​

<% 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。当然,您可以考虑使用基于查询字符串的url,或者使用类似jQuery(或其他脚本助手)的方式提交数据而不需要表单(如果脚本可用),而不是2 * n表单。

+0

好的。我会尝试,但我无法控制在受控方传递的项目?论证应该是什么类型?我试图在这一点上只通过字符串.... – Pompair 2009-01-12 13:45:31

+0

那么,字符串,然后。 – 2009-01-12 15:04:16

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

回答对自己和其他MVC新手:

我得到了它终于与此代码的工作:

VIEW:

<%=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(); 
} 

调试应用程序在跳转方法给了我很好的“Barrack”字符串的名称参数,但人参数在null中。

我也明白什么样批评家试图解释:可以很容易地发送简单的数据类型,如字符串和整数到控制器,但复杂的类型,比如我的Person对象需要别的东西。

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

干杯, Pom