ViewModel属性在HttpPost上保持为null

时间:2013-09-05 12:59:57

标签: c# .net asp.net-mvc-4

我完全不知道这个简单的概念似乎不起作用。我有一个ViewModel,一个Controller和一个View ...

这是我的基本ViewModel

public class CreateProfessionalEducationViewModel
{

    public Models.ProfessionalEducation ProfessionalEducation;

    public int ConsultantId;

    public CreateProfessionalEducationViewModel() {} // parameterless constr

}

这些是我的2控制器方法

 public ActionResult Create(int id)
    {
        var viewModel = new CreateProfessionalEducationViewModel
        {
            ConsultantId = id
        };

        return View(viewModel);
    }

    //
    // POST: /ProfessionalEducation/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(CreateProfessionalEducationViewModel collection)
    {
        if (ModelState.IsValid)
        {
            //db.ProfessionalEducations.Add(professionaleducation);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View();
    }

和我的看法......

@model Axxes_Virtual_Resume_MVC.ViewModel.ProfessionalEducation.CreateProfessionalEducationViewModel
@using (Html.BeginForm("Create", "ProfessionalEducation")) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>ProfessionalEducation</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.ProfessionalEducation.Year)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ProfessionalEducation.Year)
        @Html.ValidationMessageFor(model => model.ProfessionalEducation.Year)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ProfessionalEducation.Title)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ProfessionalEducation.Title)
        @Html.ValidationMessageFor(model => model.ProfessionalEducation.Title)
    </div>
    @Html.HiddenFor(model => model.ConsultantId)
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

出于一些奇怪的原因,我的ConsultantId为0,当我的ViewModel中的ProfessionalEducation返回到我的控制器中的HttpPost Create方法时为空。

这应该是如此基本,我忘记了什么?

提前致谢!!

3 个答案:

答案 0 :(得分:1)

主要的问题是,DefaultModelBinder(从HttpFormCollection重构视图模型的那个)对属性而不是变量起作用。

如果我没弄错的话,我确实相信默认的模型绑定器如果你在Viewmodel中使用这样的内部对象并且直接在View中访问它们的属性就不会那么好。

尝试类似的东西:

public class CreateProfessionalEducationViewModel
{
    public int ConsultantId  { get; set; }

    public int ProfessionalEducationYear { get; set; }

    public string ProfessionalEducationTitle  { get; set; }
}

对于当然的观点

@model Axxes_Virtual_Resume_MVC.ViewModel.ProfessionalEducation.CreateProfessionalEducationViewModel
@using (Html.BeginForm("Create", "ProfessionalEducation")) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend>ProfessionalEducation</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.ProfessionalEducationYear )
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ProfessionalEducationYear )
        @Html.ValidationMessageFor(model => model.ProfessionalEducationYear )
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.ProfessionalEducationTitle)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.ProfessionalEducationTitle)
        @Html.ValidationMessageFor(model => model.ProfessionalEducationTitle)
    </div>
    @Html.HiddenFor(model => model.ConsultantId)
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

通常尽量避免在ViewModel中引用Model对象(但这只是一个设计规则)

答案 1 :(得分:1)

在我的ViewModel中使用属性而不是字段为我修复了它。

感谢任何人的努力。

答案 2 :(得分:0)

标签的name属性必须是“ProfessionalEducation.Year”或“ProfessionalEducation.Title”才能使默认绑定生效。 所以使用这个:

@Html.TextBox("ProfessionalEducation.Year")

而不是

@Html.EditorFor(model => model.ProfessionalEducation.Year)

和Title属性相同。 您可以在这篇有用的帖子中阅读有关ASP.NET MVC模型绑定的更多信息: http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx