为什么我的表单没有在我的视图模型上填充我的列表?

时间:2015-04-03 20:07:37

标签: c# .net asp.net-mvc-5 viewmodel

当我构建表单时,我的列表正确填充。但是,当我回发到我的控制器时,列表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"对象的列表,以及所有其他具有默认/构造值的属性。是否有SynonymTerm为空的原因?

1 个答案:

答案 0 :(得分:0)

我找到了答案。在我的ViewModel中,我需要为列表添加一个getter / setter:

public List<SynonymTermEditViewModel> SynonymTerm { get; set; }

根据this similar question,显然它们是MVC使用的反射所必需的。

相关问题