将表单数据传递到确认视图

时间:2013-10-19 00:06:25

标签: c# asp.net-mvc asp.net-mvc-4

我有一个简单的表单,我通过创建操作向用户显示。提交表单后,我会向他们显示一个新的确认视图,他们可以在这里输入他们的电子邮件地址,然后发送一份表格。

为了正确填写电子邮件,我需要保留刚刚完成的MonthlyReport表单中的所有数据。但是,我发现很难在Confirmation视图中保留Get和Post请求中的报告数据。

当我从确认页面发帖时,我发现我的ConfirmationViewModel不再包含有效报告。

    [HttpPost]
    public ViewResult Create(MonthlyReport model)
    {
        if (ModelState.IsValid)
        {
            var modelDto = _factory.CreateDataTransferObject(model);
            _repository.Submit(modelDto);

            ModelState.Clear();

            return Confirmation(model);
        }

        return Create();
    }

    [HttpGet]
    public ViewResult Confirmation(MonthlyReport model)
    {
        var confirmation = new ConfirmationViewModel();
        confirmation.Report = model;
        return View("Confirmation", confirmation);
    }

    [HttpPost]
    public ViewResult Confirmation(ConfirmationViewModel model)
    {
        if (ModelState.IsValid)
        {
            try
            {
                var email = _mailer.MonthlyReportEmail(model);
                email.DeliverAsync();
            }
            catch (Exception error)
            {
                Trace.WriteLine(String.Format("Sending mail failed: {0}", error));
            }

            TempData["message"] = "Confirmation e-mail sent.";
        }
        return View("Confirmation");
    }

以下是确认视图:

@model Domain.Entities.ConfirmationViewModel

@{
    ViewBag.Title = "Confirmation";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Monthly report for @Model.Report.LearnerName has been saved.</h2>

@using (Html.BeginForm("Confirmation", "MonthlyReport", Model))
{
    <h4>Enter your e-mail address to receive a copy of the report.</h4>
    <table>
        <tr>
            <td colspan="2">@Html.ValidationMessageFor(x => x.EmailAddress)</td>
        </tr>
        <tr>
            <td>@Html.TextBoxFor(x => x.EmailAddress, new { @class = "input-field" })</td>
            <td>
                <input type="submit" class="small-submit-button" value="Send" />
            </td>
        </tr>
    </table>
}

1 个答案:

答案 0 :(得分:2)

当您显示Confirmation视图时,您将通过Create操作传递已发布的模型。

在发布Confirmation表单后,您将在输入中发布数据。由于您没有报告属性的输入...此信息不会发布。

你有一些选择:

  1. 为报告模型中的每个相关媒体添加隐藏输入
  2. 将信息保存在服务器中,并在用户发布“确认”表单后检索该信息。您可以将报告数据保存在数据库TempData或会话中。