我使用asp net MVC 3作为我的项目之一。我使用局部视图进行编码。我想列出列表中的所有客户,并将其信息作为列表提交。当我尝试在帖子中提交我的列表时,它发送我的列表为空。您可以在下面找到我的代码:
我的控制器方法是:
[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>
}
提前致谢。
凯雷姆
答案 0 :(得分:1)
我会使用编辑模板来处理此问题。让您的View模型像这样表示CheckBox项目。
public class ReportedUserViewModel
{
public string FirstName { set;get;}
public int Id { set;get;}
public bool IsSelected { set;get;}
}
现在在主视图模型中,添加一个属性,该属性是上述类
的集合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
和Crete一个名为 EditorTemplate 的文件夹,然后使用与属性名称(ReportedUsers.cshtml
)相同的名称创建一个新视图
将此代码添加到新创建的编辑器模板中。
@model ReportedUserViewModel
<p>
<b>@Model.FirstName </b> :
@Html.CheckBoxFor(x => x.IsSelected) <br />
@Html.HiddenFor(x=>x.Id)
</p>
现在,在主视图中,使用EditorFor
Html Helper方法调用编辑器模板。
@model ConfirmUserViewModel
@using (Html.BeginForm())
{
<div>
@Html.EditorFor(m=>m.ReportedUsers)
</div>
<input type="submit" value="Submit" />
}
现在,当您发布表单时,您的模型将具有ReportedUsers
集合,其中所选复选框将具有IsSelected
属性的True值。
[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);
}
答案 1 :(得分:0)
使用您编写的代码,MVC模型绑定机制不知道如何将这些输入映射到对象List。
改为做这个小技巧:
@Html.CheckBox("[" + i + "]." + "IsReported", Model[i].IsReported.Value);
这将导致输入字段的名称为[0] .IsReported为列表中的第一项,[1] .IsReported for next item。
这应该有效。
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
答案 2 :(得分:0)
我参加派对有点晚了,但如果你把它嵌入模型中就很容易引用这个列表 -
@Html.CheckBoxFor(modelItem => Model.List[i].Selected)
这将为迭代器中的每个项目回发。
答案 3 :(得分:0)
@ Html.CheckBox(“[”+ i +“]。”+“IsReported”,Model [i] .IsReported.Value); 对我来说很完美。
确保您的帖子方法包含列表的参数。 例如public ActionResult Index(ConfigViewModel model,List configurationList)
在我的情况下,我有一个包含列表对象的视图模型(模型)。 如果您在post方法中指定视图模型,那么您将获得列表的空值(此处模型对象为null)。但是,如果在操作中添加特定列表参数(configurationList),则可以获取控制器中的所有列表值。
答案 4 :(得分:0)
我上周遇到了同样的问题。
当我从数据库中获取复选框时,我意识到复选框有三个值(true / false / null),因为当我设置数据库时,我让复选框值为nullable。我重新设计了数据库,问题解决了。
你没有发布模型,所以我不确定是否是这种情况。只要看一下模型,如果它在你的Ischeck属性上写Nullable,就去数据库并重新设计。记住isCheck,isSelected属性必须只有两个值(true / false)。