ViewModel属性在HttpPost上保持为空 [英] ViewModel properties stay null on 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屋!