ASP.NET MVC一个特定的视图模型属性在返回视图时变为null

时间:2014-12-10 16:37:26

标签: c# asp.net asp.net-mvc post actionresult

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

1 个答案:

答案 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);