问题描述
||
我有一个带有页面的MVC 3应用程序,用户可以在其中请求有关我们服务的更多信息。
当用户从下拉列表中选择其状态时,我想使用jQuery ajax来获取我们在该状态下提供的产品列表。对于每个产品,我想在产品名称旁边显示一个复选框。然后,用户可以选择他们感兴趣的产品。
我想将所选产品绑定到该视图模型的List属性。因此,模型将具有名称,电子邮件等属性和List属性。这是我尝试绑定到的模型类的示例:
public class RequestInformationModel
{
public string Name { get; set; }
public string Email { get; set; }
public List<Product> Products { get; set; }
}
这是控制器方法,我会将表单发布到:
public ActionResult RequestInformation(RequestInformationModel model)
{
// do stuff
}
有关如何完成此操作的任何建议?非常感谢。
解决方法
如果您在产品对象中的字段名称前加上列表名称并在方括号中添加索引,则MVC会为您绑定列表
例如。
<input type=\"checkbox\" name=\"Products[0].InterestedInCheckbox\" />
<input type=\"checkbox\" name=\"Products[1].InterestedInCheckbox\" />
在这种情况下,Product对象需要一个名为InterestedInCheckbox的bool属性。
为了使此方法起作用,您应该具有从0开始的顺序索引(如果不是这种情况,则需要一个隐藏字段和稍微不同的技术)
最后,我将使用Html Checkbox帮助程序创建复选框,因为这将在需要的复选框之后输出一个隐藏字段:
(以下代码未经测试)
@for (var i = 0; i < Model.Count; i++)
{
@Html.CheckBox(string.Format(\"Products[{0}]\",i),Model[i])
}
, 我认为您想要的是这样的:
/* Handles ajax request */
[HttpPost]
public ContentResult(string selectedListBoxItem)
{
string content = \"\";
/* TODO: Query DB to get product suggestions based on selectedListBoxItem */
content = \"<input type=\'checkbox\' id=\'productId1\' name=\'productSuggestion\' value=\'productId1\'>\";
content += \"<input type=\'checkbox\' id=\'productId2\' name=\'productSuggestion\' value=\'productId2\'>\";
content += \"<input type=\'checkbox\' id=\'productId2\' name=\'productSuggestion\' value=\'productId2\'>\";
return Content(content);
}
/* Handles final submit */
[HttpPost]
public ActionResult HandleSubmit(string nameOfCheckboxCollection)
{
string[] arrayChecked = nameOfCheckboxCollection.Split(\",\");
foreach(string s in arrayChecked ) {
Model.addProduct(s);
}
}