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

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

现在我看到您正在 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);