我有一个viewmodel,它包含另一个viewmodel的列表。正如这里所示:
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时,Categories为null。有什么建议吗?
答案 0 :(得分:1)
首先,我不了解您的类别模板应该如何工作。你正在混淆你的布尔和id并以某种方式期望它们绑定......这就是我认为你希望它如何工作。
将类别编辑器模板更改为此(应该称为CategoryViewModel.cshtml)关键是您需要隐藏值才能将它们发布回服务器。而且,就像Stephen提到的那样,你没有使用输入字段的助手来覆盖编辑模板自动收集命名。
@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
语句。
答案 1 :(得分:0)
如果您在发布到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])
}
答案 2 :(得分:0)
在您的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)
}