我使用asp net MVC 3我的项目之一。我使用部分视图进行编码。我想在列表中列出所有客户,并将其信息作为列表提交。当我尝试在帖子中提交我的列表时,它将发送我的列表为null。您可以找到我的代码如下:
我的控制器方法是:
[HttpPost]
public ActionResult ConfirmUsers(ICollection<Career.DomainModel.UserApprovalDto> collection)
{
string bas = "";
//if (collection != null)
if (ModelState.IsValid)
{
bas = "bas";
}
return RedirectToAction("Index");
}
我的部分视图是:
@model List<Career.DomainModel.UserApprovalDto>
@using (Html.BeginForm("ConfirmUsers", "ManageUsers", new { area = "" }, FormMethod.Post))
{
<table>
<tr>
<th>
Name
</th>
<th>
Is Reported
</th>
</tr>
@for (int i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => Model[i].FirstName)
</td>
<td>
@Html.CheckBox("IsReported", Model[i].IsReported.HasValue ? Model[i].IsReported.Value : false)
@*@Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);*@ @* @if (Model[i].IsReported != null)
{
@Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);
}
else
{
@Html.CheckBoxFor(modelItem => Model[i].IsReported.Value);
}*@
</td>
<td>
</td>
</tr>
}
</table>
<div>
<input name="submitUsers" type="submit" value="Save" />
</div>
}
预先感谢。
kerem
我将使用编辑器模板处理此操作。拥有这样的视图模型来表示复选框项目。
public class ReportedUserViewModel
{
public string FirstName { set;get;}
public int Id { set;get;}
public bool IsSelected { set;get;}
}
现在在Yout Main View模型中,添加一个属性,该属性是上述类的集合
public class ConfirmUserViewModel
{
public List<ReportedUserViewModel> ReportedUsers{ get; set; }
//Other Properties also here
public ConfirmUserViewModel()
{
ReportedUsers=new List<ReportedUserViewModel>();
}
}
现在在GET
操作中,您将填充ViewModel的值并将其发送到视图。
public ActionResult ConfirmUser()
{
var vm = new ConfirmUserViewModel();
//The below code is hardcoded for demo. you mat replace with DB data.
vm.ReportedUsers.Add(new ReportedUserViewModel { Name = "Test1" , Id=1});
vm.ReportedUsers.Add(new ReportedUserViewModel { Name = "Test2", Id=2 });
return View(vm);
}
现在,让我们创建一个EditorteMplate。转到Views/YourControllerName
,然后将一个称为 EditorteMplate 的文件夹转换,并在其中创建一个与属性名称相同名称(ReportedUsers.cshtml
)
将此代码添加到新创建的编辑器模板中。
@model ReportedUserViewModel
<p>
<b>@Model.FirstName </b> :
@Html.CheckBoxFor(x => x.IsSelected) <br />
@Html.HiddenFor(x=>x.Id)
</p>
现在,在您的主视图中,使用EditorFor
HTML助手方法调用编辑器模板。
@model ConfirmUserViewModel
@using (Html.BeginForm())
{
<div>
@Html.EditorFor(m=>m.ReportedUsers)
</div>
<input type="submit" value="Submit" />
}
现在发布表单时,您的模型将具有ReportedUsers
集合,其中选定的复选框将具有IsSelected
属性的真实值。
[HttpPost]
public ActionResult AddAlert(ConfirmUserViewModel model)
{
if(ModelState.IsValid)
{
//Check for model.ReportedUsers collection and Each items
// IsSelected property value.
//Save and Redirect(PRG pattern)
}
return View(model);
}
使用您编写的代码,MVC模型粘合剂机制不知道如何将这些输入映射到对象列表中。
而是做这个小技巧:
@Html.CheckBox("[" + i + "]." + "IsReported", Model[i].IsReported.Value);
这将导致输入字段的名称为[0]。列表中的第一个项目,[1]。
应该有效的。
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
我在聚会上有点晚了,但是如果将其嵌入模型 -
,则很容易参考列表@Html.CheckBoxFor(modelItem => Model.List[i].Selected)
将向迭代器中的每个项目发回。
@html.checkbox(" [" i "]。" " isReported",model [i] .isreported.value);为我工作得很完美。
确保您的发布方法包含列表的参数。例如,公共ActionResult索引(ConfigViewModel模型,列表ConfigurationList)
在我的情况下,我有一个包含列表对象的视图模型(模型)。如果您在发布方法中指定视图模型,则将获得列表的空值(此处模型对象为null)。但是,如果在操作中添加特定列表参数(configurationList),则可以在控制器中获取所有列表值。
我上周遇到了同一问题。
我意识到,当我从数据库中获取它时,复选框具有三个值(true/fals/fals/null),因为当我删除数据库时,复选框值可nullull。我对DB进行了重新调整,并解决了问题。
您没有发布模型,所以我不确定是否是这种情况。只需查看该模型,如果在Ischeck属性上方编写无效,请转到数据库并重新设计。请记住Ischeck,Isseleal的属性只有两个值(true/false)。