MVC维护模型通过多视图表单提交

本文关键字:视图 表单提交 维护 模型 MVC | 更新日期: 2023-09-27 17:55:59

所以我正在开发一个MVC,基本上是三个步骤。

为每个步骤创建一个视图,即斯蒂芬一第二步第三步

在第一步和第二步中,我要求用户输入一些详细信息。

我存储在一个模型中的多个步骤的所有值。

从StepOne到StepTwo很好。正在设置和维护模型中的某些值。

但是在 StepTwo 上,当我执行第二个 httppost 并传递模型时,它似乎只是创建了模型的新实例,并且不维护 stepone 中的值。

<% using (Html.BeginForm("StepTwo", "Home", FormMethod.Post, new { id = "restrictionForm" }))   { %>
<%: Html.AntiForgeryToken() %>
<div id="wrapping" class="clearfix">
    <h3>Postcode Restriction Type : </h3>
    <%= Html.DropDownListFor(x => x.SelectedRestriction, Model.RestrictionTypes,"Select Restriction...", new { @class = "selmenu required" }) %>
    <h3>Restriction Description : </h3>
    <%= Html.TextBoxFor(m => m.RestrictionDescription, new { @class = "txtblock required" }) %>
</div>
<section id="buttons">
    <input type="submit" value="Submit" id="submitBtn" />     
</section>

在我的控制器中

在页面加载时,我的模型仍然完好无损,并且仍然保持上一步的值。

    [Authorize]
    public ActionResult StepTwo(PostcodesModel model)
    {
        var summaryMessage = "";
        model.SummaryMessage = summaryMessage;
        model.RestrictionTypes = _Provider.GetRestrictionTypes();
        return View(model);
    }

但是在 Httppost 上,模型已经失去了价值,似乎已经创建了模型的新实例。

    [Authorize]
    [HttpPost]
    [ActionName("StepTwo")]
    [ValidateAntiForgeryToken]
    public ActionResult StepTwoPost(PostcodesModel model)
    {
        return View(model);
    }

知道我如何在 Http 帖子之间维护模型吗?

MVC维护模型通过多视图表单提交

从您的问题来看,您似乎认为模型在请求中仍然存在。这不是真的。

您可以通过模型从控制器将信息传递到视图,

也可以将值从视图提交到控制器,MVC 通过将 html 表单输入绑定到视图模型来处理此问题。

如果要在每个步骤中保留视图模型,则需要在调用新视图时获取接受的值并将其复制到新模型中(或直接注入)。

像这样的东西(我只是从我的头上打了这个,所以它不干净,但应该给你一个想法):

    [HttpGet]
    public ActionResult StepOne()
    {
        var model = new MyNewModel();
        return View(model);
    }
    /* NOTE THE MODEL PASSED BACK HERE IS NOT THE EXACT SAME OBJECT
    AS THE ONE CREATED IN THE GET ACTION ABOVE, MODEL BINDING HAS OCCURRED 
    TO READ YOUR FORM INPUTS AND MATCH THEM TO A NEW MODEL WHICH IS EXPECTED */
    [HttpPost]
    public ActionResult StepOne(MyNewModel model)
    {
        if (ModelState.IsValid)
        {
            // Do something here
            // pass model to new view
            TempData["model"] = model;
            return RedirectToAction("StepTwo");
        }
        return View(model);
    }
    [HttpGet]
    public ActionResult StepTwo()
    {
        MyNewModel model;
        if (TempData["model"] != null)
        {
            model = (MyNewModel) TempData["model"];
            // make some changes if necessary
            model.MyProperty = 2;
            return View(model);
        }
        return RedirectToAction("StepOne");
    }

我认为您还可以将模型保留在会话(每个应用程序)或视图状态(每页)中。

每次发布帖子时,您都会升级会话。这也是最佳选择,因为在客户端,您只收到会话标识符。

会话和视图状态之间的一些区别:

  1. Session是按应用程序执行的,而ViewState是按页执行
  2. Session仅向客户端发送会话标识符,而ViewState发送加密文本