ViewModel属性在HttpPost上保持为空 [英] ViewModel properties stay null on HttpPost

查看:38
本文介绍了ViewModel属性在HttpPost上保持为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我完全感到困惑,这个简单的概念似乎行不通.我有一个ViewModel,一个控制器和一个视图...

I'm completely puzzled how this simple concept doesn't seem to work. I have a ViewModel, a Controller and a View...

这是我的基本ViewModel

This is my basic ViewModel

public class CreateProfessionalEducationViewModel
{

    public Models.ProfessionalEducation ProfessionalEducation;

    public int ConsultantId;

    public CreateProfessionalEducationViewModel() {} // parameterless constr

}

这是我的2种控制器方法

These are my 2 controller methods

 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>
}

出于某种奇怪的原因,当我的ViewModel发布回控制器中的HttpPost Create方法时,我的ConsultantId为0,ProfessionalEducation为null.

For some weird reason my ConsultantId is 0 and ProfessionalEducation is null in my ViewModel when posted back to the HttpPost Create method in my controller.

这应该很基础,我忘记了什么?

This should be so basic, what am I forgetting?

提前谢谢!

推荐答案

主要问题在于,这是 DefaultModelBinder 的疯子(从 HttpFormCollection 重构视图模型的原因))适用于属性而非变量.

The main problem is that, the loony that is the DefaultModelBinder (what reconstruct viewmodels from an HttpFormCollection) works on properties not variables.

如果我没记错的话,我相信如果您在Viewmodel中使用诸如此类的内部对象并直接在View中访问其属性,则默认模型绑定程序将无法正常工作.

And if I'm not mistaken, I do believe the default model binder don't work so well if you use inner objects like that in your Viewmodel and access their properties directly in the 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>
}

通常,请避免在ViewModels中引用模型对象(但这只是设计规则)

As a rule try to avoid referencing Model objects in your ViewModels (but that's just a design rule)

这篇关于ViewModel属性在HttpPost上保持为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆