我完全不知道这个简单的概念似乎不起作用。我有一个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方法时为空。
这应该是如此基本,我忘记了什么?
提前致谢!!
答案 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