我有一个父级捐赠,在一个名为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 });
}
答案 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)
}