Asp.net mvc 4 ASP.NET MVC编辑器模板包含提交表单,到达控制器时值为空

Asp.net mvc 4 ASP.NET MVC编辑器模板包含提交表单,到达控制器时值为空,asp.net-mvc-4,Asp.net Mvc 4,我有一个父母捐赠基金,在一个叫做Criteria的集合中有很多标准。我正在构建一个编辑表单,希望在其中编辑父属性以及添加/删除标准 Endowment.cs、Criteria.cs和EndowmentEditViewModel.cs public class Endowmment { public int ID {get; set;} public string Description {get; set;} ... public virtual ICollect

我有一个父母捐赠基金,在一个叫做Criteria的集合中有很多标准。我正在构建一个编辑表单,希望在其中编辑父属性以及添加/删除标准

Endowment.cs、Criteria.cs和EndowmentEditViewModel.cs

public class Endowmment {
    public int ID {get; set;}
    public string Description {get; set;}
    ...
    public virtual ICollection<Criterion> Criteria {get; set;}
}

public class Criterion {
    public int ID {get; set;}
    public int EndowmentID {get; set;}
    public string Description {get; set;}
    public string SortOrder {get; set;}
}

public class EndowmentEditViewModel {
    public Endowment Endowment {get; set;}
    ...
}

这就是我为了让它工作所做的:

在我看来,Views/Endowment/Edit.cshtml

@model EndowmentEditViewModel

@using (Html.BeginForm("Edit", "Endowment")
{
    @Html.HiddenFor(m => m.Endowment.ID)
    @Html.TextBoxFor(m => m.Endowment.Description)
    <input type="submit" value="Save endowment" />
}

@Html.EditorFor(m => m.Endowment.Criteria)
@*@Html.EditorFor(m => m.Endowment.Criteria)*@
@foreach (var criterion in Model.Endowment.Criteria)
{
    @Html.EditorFor(m => criterion)
}
....
在controller/Controllers/CriterionController.cs中

[HttpPost]
public ActionResult Edit(Criterion model)
{
    if (ModelState.IsValid)
    {
        repository.SaveCriterion(model);
        // insert happy message
        TempData["message"] = string.Format("Criterion {0} was saved", model.Description);
    }
    else
    {
        // there is something wrong with the data values
        // inesrt fail message
    }
    return RedirectToAction("Edit", "Endowment", new { id = model.EndowmentID });
}
[HttpPost]
public ActionResult Edit([Bind(Prefix = "criterion")] Criterion model)
{
    ...
编辑器模板中没有更改


奇怪。我原以为foreach在某种意义上是愚蠢的,但它是为了这个特殊的目的而工作的。好吧,我想任何父母/孩子在同一个观点也是愚蠢的,但这对我来说是有效的。如果有更好的方法,我很想知道。

有一个稍微好一点的方法。MVC将为您枚举模型对象,并为列表中的每个项目显示一次编辑器模板。例如,这:

@Html.EditorFor(m => criterion) //Assumes criterion is is a list or collection 
做与此相同的事情:

@foreach (var criterion in Model.Endowment.Criteria)
{
    @Html.EditorFor(m => criterion)
}
@foreach (var criterion in Model.Endowment.Criteria)
{
    @Html.EditorFor(m => criterion)
}