具有不返回对象列表的对象列表的MVC 4对象

时间:2014-08-16 18:58:20

标签: c# asp.net-mvc-4

我有一个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。有什么建议吗?

3 个答案:

答案 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>

您的奖品观点应与您发布的内容完全一致。

不要。我再说一遍,不要在编辑器模板和集合中使用任何形式的foreachfor语句。

答案 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)
}