带有对象列表的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返回时,类别为空。有什么建议吗?

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

首先,我不明白你的类别模板应该如何工作。你混淆了布尔和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>

你的奖品视图应该和你发布的完全一样。

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

如果你通过循环类别当张贴到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)
}