MVC维护模型通过多视图形式提交

时间:2014-04-01 11:05:37

标签: c# asp.net-mvc

所以我正在研究MVC,这基本上是三个步骤。

为每一步创建一个视图,即 第一步 第二步 StepThree

在第一步和第二步,我要求用户输入一些细节。

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

从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帖子之间的模型吗?

2 个答案:

答案 0 :(得分:1)

从您的问题看来,您认为模型会在请求中持续存在。事实并非如此。

您可以通过控制器中的模型将信息传递给视图,或者将视图中的值提交给控制器,MVC通过将html表单输入绑定到View模型来处理此问题。

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

这样的东西(我只是把它打印出来,所以它不干净,但应该给你一个想法):

    [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 :(得分:0)

我认为您还可以将模型保存在Session(每个应用程序)或ViewState(每页)中。

每次发帖都会升级会话。它也是最佳的,因为在客户端,您只收到会话标识符。

Session和Viewstate之间的一些区别:

    每个应用程序
  1. Session,而每页ViewState
  2. Session仅向客户端发送会话标识符,而ViewState发送一个ecrypted文本