好的,我是一个来自webforms背景的MVC新手,所以请原谅这里的任何无知。这是我的情景。我有一个包含应用程序列表和相关权限的表。每个表行包含3条信息:一个复选框,一些描述该行的文本,以及一个允许用户为应用程序选择适当权限的下拉列表。我想发布这些数据,只能使用已检查的表中的行(行的id嵌入为复选框名称)。从那里,我想从DropDownList中获取所选值,并调用必要的代码来更新数据库。这是我的View页面的代码:
<%foreach (var app in newApps)
{ %>
<tr>
<td><input type="checkbox" name="AddApps" value="<%=app.ApplicationId %>" /></td>
<td><%=Html.Encode(app.ApplicationName)%></td>
<td><%=Html.DropDownList("AppRole", new SelectList(app.Roles, "RoleId", "RoleDescription"))%></td>
</tr>
<%} %>
当我到达表单帖子上的控制器时,如何从FormCollection中检索适当的值?我之前做过这个,当时我只通过调用Request.Form [“CheckBoxName”]并解析字符串来检索复选框值。
或者我是否完全错了?
答案 0 :(得分:2)
为了发布你的数据,控制器可以读取它必须在表单中的信息,你是正确的一半:
<% using(Html.BeginForm("Retrieve", "Home")) %>//Retrieve is the name of the action while Home is the name of the controller
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
<td><%=Html.Encode(app.ApplicationName)%></td>
<td><%=Html.DropDownList("AppRole", new SelectList(app.Roles, "RoleId", "RoleDescription"))%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
并在您的控制器上:
public ActionResult Retrieve()
{
//since all variables are dynamically bound you must load your DB into strings in a for loop as so:
List<app>=newApps;
for(int i=0; i<app.Count;i++)
{
var checkobx=Request.Form[""+app[i].ApplicationId];
// the reason you check for false because the Html checkbox helper does some kind of freaky thing for value true: it makes the string read "true, false"
if(checkbox!="false")
{
//etc...almost same for other parameters you want that are in thr form
}
}
//of course return your view
return View("Index");//this vaires by the name of your view ex: if Index.aspx
}
此网站提供了有关如何处理下拉列表帮助程序的更多详细信息:
http://quickstarts.asp.net/previews/mvc/mvc_HowToRenderFormUsingHtmlHelpers.htm
答案 1 :(得分:1)
Request.Form仍然有效,除了你的复选框都具有相同的名称。
因此,一种方法是给复选框指定不同的名称,例如“AddApps-app.id”,并使用Request.Form。
然而,更优雅和可测试的方法是使用列表绑定。
在此模型中,您为表单元素指定了某个结构化名称,默认模型绑定器将每组表单元素包装到控制器中的类型化记录列表中。 This is fully explained in this blog post
这里的优点是您的控制器只处理应用程序类型的实例,因此没有隐式依赖于视图的结构。因此,单元测试非常容易。