从模型外部的MVC视图中获取值

时间:2015-07-13 15:39:58

标签: c# asp.net-mvc

我有一个Create视图,它与表单一起显示一个值。当他们提交时,我希望也有这个价值。

在我的控制器中我有这个:

public ActionResult Create(Guid? id)
{
    if (id == null || id == Guid.Empty) return View();
    ViewBag.RegistrationVerificationId = id; 
    var email = (from rv in _db.RegistrationVerification
                 where rv.RegistrationVerificationId == id
                 select rv.Email).FirstOrDefault();
    ViewBag.Email = email;
    return View();
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Profile profileModel)
{
    if (ModelState.IsValid)
    {
        var emailValue = @ViewBag.Email;
        //...
    }
    //...
 }

我的观点如下:

@model PublicationSystem.Model.Profile
@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Profile</h4>
        <hr />
        @Html.ValidationSummary(true)

        @Html.HiddenFor(model => model.ProfileId)
        <div class="form-group">
            @Html.Label("Email Provided", htmlAttributes: new {@class = "control-label col-md-2"})
            <div class="col-md-10">
                @ViewBag.Email
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Salutation, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Salutation)
                @Html.ValidationMessageFor(model => model.Salutation)
            </div>
        </div>
        ....
}

在Response和Postback之间存储值的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

Session["email"] = email;

这将存储响应和回发之间的值。如果这是您正在寻找的,请告诉我。

答案 1 :(得分:0)

TempData 可以为您效劳。另一个选择是将它存储在隐藏字段中并在POST时接收它,但你应该知道“坏用户”可以修改它(例如通过浏览器开发人员工具)。

答案 2 :(得分:0)

如果您需要使用视图呈现的值到达POST

您应该将该值添加到模型中(在您的情况下为Profile)。

如果您需要使用POST保存的值以在下一个视图中加载

如果您使用相同的操作(return View()),只需预加载模型。

DoStuff();
return View(new Model { MyValue = "foo" });

如果要重定向到其他操作,请使用持久状态,并使用适当的路由参数重定向。

var transactionId = SaveThings();
return RedirectToAction("Confirmation", new {transactionId});

根据您保存信息的方式加载所需的值。如果信息可以保留在路线参数中,甚至更简单。