带有对象列表的MVC 4对象不返回对象列表
本文关键字:对象 列表 返回 MVC | 更新日期: 2023-09-27 18:18:22
我有一个视图模型,其中包含另一个视图模型的列表。如下所示:
public class PrizeViewModel
{
public Guid PrizeId { get; set; }
public string Description { get; set; }
public List<CategoryViewModel> Categories { get; set; }
}
CategoryViewModel定义如下:
[Serializable]
public class CategoryViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public bool Selected { get; set; }
}
奖品视图是这样的:
@model PrizeViewModel
@{
ViewBag.Title = "Create";
}
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Prize</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Description, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Description, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Description, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Categories, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<a href="#" class="btn btn-default category-create">Create New Category</a>
@Html.EditorFor(model => model.Categories, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
我有一个CategoryEditorTemplate:
@model CategoryViewModel
<div>
<span><input id="@Model.Id" name="@Model.Id" type="checkbox" checked="@(Model.Selected)" value="@Model.Name" /></span>
<label for="@Model.Id">@Model.Name</label>
</div>
控制器中的Create方法采用PrizeViewModel,我遇到的问题是,当我得到PrizeViewModel返回时,类别为空。有什么建议吗?
首先,我不明白你的类别模板应该如何工作。你混淆了布尔和id,并期望它们绑定…以下是我认为你希望它工作的方式。
将您的类别编辑器模板更改为此(它应该称为CategoryViewModel.cshtml)关键是您需要隐藏值以便将它们发送回服务器。而且,正如Stephen提到的,您没有为输入字段使用帮助器,从而重写了Editor Template自动集合命名。
@model CategoryViewModel
<div>
@Html.HiddenFor(x => x.Id)
@Html.HiddenFor(x => x.Name)
<Label>@Html.CheckBoxFor(x => x.Selected) @Model.Name</label>
</div>
你的奖品视图应该和你发布的完全一样。
。我重复一遍,不要在编辑器模板和集合中使用任何形式的foreach
或for
语句。
如果你通过循环类别当张贴到actionresult时,它将能够绑定模型到列表这里是关于绑定模型到列表的文章
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/
下面是如何制作它的例子:
@for(int i = 0; i < Model.Categories.Count(); i++)
{
@Html.EditorFor(model => Model.Categories[i])
}
在你的CategoryEditorTemplate
中,当你做...name="@Model.Id"...
分类的html应该看起来像
<input type="text" name=Categories[0].Name ...
<input type="checkbox" name=Categories[0].Selected...
<input type="text" name=Categories[1].Name ...
....
在模板中使用帮助器,例如
@Html.TextBoxFor(m => m.Name)
@Html.CheckBoxFor(m => m.Selected)
或删除模板并使用for
循环来生成html
@for(int i = 0; i < Model.Categories.Count; i++)
{
@Html.TextBoxFor(m => m.Categories[i].Name)
@Html.CheckBoxFor(m => m.Categories[i].Selected)
}