为什么我的表单没有在我的视图模型中填充我的列表?
Why is my form not populating my list on my view model?
当我构建表单时,我的列表会正确填充。然而,当我 post 回到我的控制器时,列表 SynonymTerm
为空。
这是我的视图模型:
public class SynonymEditViewModel
{
public string Term { get; set; }
public List<SynonymTermEditViewModel> SynonymTerm;
public SynonymEditViewModel()
{
SynonymTerm = new List<SynonymTermEditViewModel>();
}
}
public class SynonymTermEditViewModel
{
public string Term { get; set; }
public string ReplacementTerm { get; set; }
public SynonymDuplicateWarning Warning { get; set; }
public SynonymTermEditViewModel()
{
Warning = new SynonymDuplicateWarning();
}
}
public class SynonymDuplicateWarning
{
public List<string> Terms { get; set; }
public SynonymDuplicateWarning()
{
Terms = new List<string>();
}
}
视图的简化版本:
Edit.cshtml
@model MyProject.ViewModels.Synonyms.SynonymEditViewModel
<div class="form-group">
<div class="col-md-2">
@Html.LabelFor(model => model.Term)
</div>
<div class="col-md-10">
@Html.HiddenFor(model => model.Term)
@Html.DisplayFor(model => model.Term)
</div>
</div>
<table id="terms-table">
<tbody>
@Html.EditorFor(model => model.SynonymTerm)
</tbody>
</table>
EditorTemplates/SynonymTermEditViewModel.cshtml
@model MyProject.ViewModels.Synonyms.SynonymTermEditViewModel
<tr>
<td>
@Html.TextBoxFor(model => model.Term)
@Html.ValidationMessageFor(model => model.Term)
@Html.EditorFor(model => model.Warning)
</td>
</tr>
这是从浏览器请求中提取的表单数据。
Term:Cat
SynonymTerm[0].Term:Feline
此数据传递给此控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(SynonymEditViewModel synonym)
{
if (ModelState.IsValid)
{
//breakpoint here
var dbSynonym = db.Synonym_Replacement_Term.Find(synonym.Term);
Mapper.Map(synonym, dbSynonym);
db.SaveChanges(User.Identity.Name, Request.ServerVariables["REMOTE_ADDR"]);
return RedirectToAction("Index");
}
return View(synonym);
}
预期的行为是 SynonymTerm
是一个列表,其中包含 1 个具有 Term="Feline"
的对象,以及具有 default/constructed 值的所有其他属性。 SynonymTerm
是否为空?
我找到了答案。在我的 ViewModel 中,我需要为列表添加一个 getter/setter:
public List<SynonymTermEditViewModel> SynonymTerm { get; set; }
显然,根据 this similar question,它们是 MVC 使用的反射所必需的。
当我构建表单时,我的列表会正确填充。然而,当我 post 回到我的控制器时,列表 SynonymTerm
为空。
这是我的视图模型:
public class SynonymEditViewModel
{
public string Term { get; set; }
public List<SynonymTermEditViewModel> SynonymTerm;
public SynonymEditViewModel()
{
SynonymTerm = new List<SynonymTermEditViewModel>();
}
}
public class SynonymTermEditViewModel
{
public string Term { get; set; }
public string ReplacementTerm { get; set; }
public SynonymDuplicateWarning Warning { get; set; }
public SynonymTermEditViewModel()
{
Warning = new SynonymDuplicateWarning();
}
}
public class SynonymDuplicateWarning
{
public List<string> Terms { get; set; }
public SynonymDuplicateWarning()
{
Terms = new List<string>();
}
}
视图的简化版本:
Edit.cshtml
@model MyProject.ViewModels.Synonyms.SynonymEditViewModel
<div class="form-group">
<div class="col-md-2">
@Html.LabelFor(model => model.Term)
</div>
<div class="col-md-10">
@Html.HiddenFor(model => model.Term)
@Html.DisplayFor(model => model.Term)
</div>
</div>
<table id="terms-table">
<tbody>
@Html.EditorFor(model => model.SynonymTerm)
</tbody>
</table>
EditorTemplates/SynonymTermEditViewModel.cshtml
@model MyProject.ViewModels.Synonyms.SynonymTermEditViewModel
<tr>
<td>
@Html.TextBoxFor(model => model.Term)
@Html.ValidationMessageFor(model => model.Term)
@Html.EditorFor(model => model.Warning)
</td>
</tr>
这是从浏览器请求中提取的表单数据。
Term:Cat
SynonymTerm[0].Term:Feline
此数据传递给此控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(SynonymEditViewModel synonym)
{
if (ModelState.IsValid)
{
//breakpoint here
var dbSynonym = db.Synonym_Replacement_Term.Find(synonym.Term);
Mapper.Map(synonym, dbSynonym);
db.SaveChanges(User.Identity.Name, Request.ServerVariables["REMOTE_ADDR"]);
return RedirectToAction("Index");
}
return View(synonym);
}
预期的行为是 SynonymTerm
是一个列表,其中包含 1 个具有 Term="Feline"
的对象,以及具有 default/constructed 值的所有其他属性。 SynonymTerm
是否为空?
我找到了答案。在我的 ViewModel 中,我需要为列表添加一个 getter/setter:
public List<SynonymTermEditViewModel> SynonymTerm { get; set; }
显然,根据 this similar question,它们是 MVC 使用的反射所必需的。