在ASP.NET MVC中我有一个视图,它是一个表单,我希望能够保存表单,然后它返回到显示您将数据保存到数据库后输入的数据的同一页面。我确定我只是在做一些愚蠢的事情(这对我来说很新),但有一些属性我想坚持,我在返回之前在视图模型上设置它们,我有{{1}在我的视图中。我的困惑是这些项目被保留,有些则没有。所以我在FormController中有以下内容(方法和名称为简洁而简化):
@Html.HiddenFor
在我的视图(cshtml)文件中我有 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);
}
以及我想要保留但未直接在表单中设置的其他属性。
但是,formID不是持久的,而其他项目(由c和p以及dateStarted表示)都可以。如果我删除其他字段的HiddenFor,那么它们就不起作用了。我每次都点击保存,并且帖子中的formID为null,但是在将表单添加到数据库之后肯定会设置它,并且formID的值肯定会被发送到视图。我只是不明白为什么它会返回null,但其他属性却没有。
这是模型的样子:
@Html.HiddenFor(model=>model.formID)
查看:
...
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
}
答案 0 :(得分:1)
现在,我发现您在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);