ASP.NET MVC 一个特定的视图模型属性在返回视图时变为 null
本文关键字:视图 属性 模型 返回 null MVC NET 一个 ASP | 更新日期: 2023-09-27 18:33:55
在 ASP.NET MVC中,我有一个表单视图,我希望能够保存表单,然后它返回到同一页面,显示您在将数据保存到数据库后输入的数据。我确定我只是在做一些愚蠢的事情(这对我来说很新(,但是我想保留一些属性,并且在返回之前将它们设置在视图模型上,并且我已经@Html.HiddenFor
在我的视图窗体中。我的困惑是,这些项目被保留了,有些没有。所以我在我的 FormController 中有以下内容(为了简洁起见,方法和名称已简化(:
public ActionResult Index(int? p, int? c)
{
FormViewModel model = new FormViewModel();
model.p = p;
model.c = c;
model.dateStarted = DateTime.Now;
return View(model);
}
[HttpPost]
public ActionResult Index(FormViewModel m)
{
Form form;
bool shouldUpdate = false;
if (m.formID != null) // m.formID is always null, but m.p, c, dateStarted aren't
{
shouldUpdate = true;
form = getFormnWithId((int)m.formID); //gets from database
}
else
{
form = new Form(m);
}
if (shouldUpdate)
{
editForm(form); //edit existing entry
}
else {
addForm(form); //add to database
}
m.formID = form.Id; // formn.Id is valid because the form has been updated with its Id after being added to the database
m.p = form.p;
m.c = form.c;
return View(m);
}
在我的视图 (cshtml( 文件中,我有@Html.HiddenFor(model=>model.formID)
以及我想保留但未直接在表单中设置的其他属性。但是,formID 不会持久化,而其他项(由 c 和 p 以及 dateStarted 表示(则很好。如果我删除其他字段的 HiddenFor,那么它们将不起作用。我每次都单击保存,formID 在帖子中为 null,但它肯定是在表单添加到数据库并且 formID 的值肯定会发送到视图之后设置的。我只是不明白为什么它返回 null 但其他属性没有。
模型如下所示:
public class FormViewModel
{
public Nullable<int> formID {get; set;}
public Nullable<int> c { get; set; }
public Nullable<int> p { get; set; }
public System.DateTime dateStarted { get; set; }
//+ other form properties
}
视图:
。
<label for="submit-form" class="btn btn-default">Save</label>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal col-md-12">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<!-- various form fields -->
</div>
@Html.HiddenFor(model => model.dateStarted)
@Html.DisplayFor(model => model.dateStarted)<br /> <!-- just to see it while testing-->
@Html.HiddenFor(model => model.c)
@Html.DisplayFor(model => model.c)<br />
@Html.HiddenFor(model => model.p)
@Html.DisplayFor(model => model.p)<br />
@Html.HiddenFor(model => model.formID)
@Html.DisplayFor(model => model.formID)
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" name="Command" class="btn btn-default hidden" id="submit-form" />
</div>
</div>
</div>
}
现在我看到您正在 POST 请求中设置Form.Id
,您的问题是您没有遵循 PRG(发布、重定向、获取(模式。 您从 POST 方法返回相同的视图,没有任何类型的重定向。 因此,模型绑定程序将保留以前的值 Form.Id,该值为 null。 模型绑定器保留先前值的原因主要是为了验证目的(如果 ModelState 有错误,您可以返回视图,属性将保留为用户输入的属性以及 ModelState 错误集合(
若要解决此问题,需要在返回视图之前重定向到另一个操作或在代码中发出ModelState.Clear()
。
m.formID = form.Id; // form.Id is valid because the form has been
//updated with its Id after being added to the database
m.p = form.p;
m.c = form.c;
ModelState.Clear();
return View(m);