包含提交表单的ASP.NET MVC编辑器模板,到达控制器时值为null

时间:2014-01-29 19:51:30

标签: asp.net-mvc-4

我有一个父级捐赠,在一个名为Criteria的集合中有许多Criterion。我正在构建一个编辑表单,我想编辑父属性以及添加/删除标准。

Endowment.cs,Criterion.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;}
    ...
}

在禀赋编辑视图中,我引用了一个名为条件的标准集合的编辑器模板,因为有一个禀赋有很多。编辑器模板位于捐赠基金的表格之外。

查看/捐赠/ 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)

在Criterion editortemplate中,我希望能够保存或删除Criterion行。

查看/共享/ EditorTemplates / Criterion.cshtml

@model Criterion

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

@using (Html.BeginForm("Delete", "Criterion", new { @id = Model.ID }))
{
    @Html.Hidden("ID", Model.ID)
    <input type="submit" value="Delete" />
}

删除操作正常,但是,当我单击“保存”时,值会在浏览器请求中发布,但Criterion控制器上的编辑操作会将它们作为空值接收。

控制器/ 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 });
}

2 个答案:

答案 0 :(得分:0)

这就是我为了让它发挥作用所做的事情:

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

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

在控制器/Controllers/CriterionController.cs

[HttpPost]
public ActionResult Edit([Bind(Prefix = "criterion")] Criterion model)
{
    ...

编辑器模板没有变化。

奇怪。我认为foreach在一个视图中是嘘声,但它适用于这个特殊目的。好吧,我想在同一个视图中的任何父母/孩子也是嘘声,但它对我有用。如果有更好的方法,我很想知道。

答案 1 :(得分:0)

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

@Html.EditorFor(m => criterion) //Assumes criterion is is a list or collection 

与此相同:

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