gpt4 book ai didi

c# - ViewModel 属性在 HttpPost 上保持为空

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:14 25 4
gpt4 key购买 nike

我完全不明白为什么这个简单的概念似乎不起作用。我有一个 ViewModel、一个 Controller 和一个 View ...

这是我的基本 ViewModel

public class CreateProfessionalEducationViewModel
{

public Models.ProfessionalEducation ProfessionalEducation;

public int ConsultantId;

public CreateProfessionalEducationViewModel() {} // parameterless constr

}

这是我的两个 Controller 方法

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

由于某些奇怪的原因,当回发到我的 Controller 中的 HttpPost Create 方法时,我的 ConsultantId 为 0 并且 ProfessionalEducation 在我的 ViewModel 中为 null。

这应该是最基本的,我忘了什么?

提前致谢!

最佳答案

主要问题是,DefaultModelBinder(从 HttpFormCollection 重建 View 模型)这个疯子作用于属性而不是变量。

如果我没记错的话,我相信如果您在 Viewmodel 中使用类似内部对象并直接在 View 中访问它们的属性,则默认模型绑定(bind)器不会工作得很好。

尝试这样的事情:

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 对象(但这只是设计规则)

关于c# - ViewModel 属性在 HttpPost 上保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18637056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com