生活在Session中的MVC ViewModel - 如何更新?

时间:2013-01-30 19:02:48

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

我已采用“标准”方式:

    public ActionResult Respondent()
    {
        return View(Session["Respondent"]); //passing the model
    }

    [HttpPost]
    public ActionResult Respondent(Respondent resp)
    {
        repository.UpdateRespondent(Respondent resp);
        Session["Respondent"] = respondent; //put back into session
        return View(respondent); //redraw view, passing in respondent
    }

它有效。我通过响应模型只为MVC自动收集FORM值,在POST操作中,在视图中我有这些属性的所有属性:

@using (Html.BeginForm())
{
    @Html.LabelFor(model => model.FirstName)
    @Html.EditorFor(model => model.FirstName)
    @Html.ValidationMessageFor(model => model.FirstName)

    // and so on...
}

我的问题是 - 如果我已经在使用Session对象(它位于Session中), 有没有什么办法可以在会话中使用Session对象作为模型,这样HttpPost就能完成所有的验证工作。那么,如何收集价值并将其重新投入会话?

谢谢。

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,最好的做法是放弃,你可以将会话对象作为模型传递。

2警告:

  1. 传递会话对象时应该转换

    返回视图((RespondentObject)会话["响应者"])

  2. 在视图中,请记住绑定到对象类型

    @model perseus.Models.RespondentObject

  3. 我建议您在控制器中读取和写入会话。

    您指出您将使用多个部分来创建表单。你有两个选择:

    • 创建一个包含所有对象的Action接收的模型。
    • 将每个参数分别传递给您的操作。

    你问为什么使用对象是不好的形式:

    • 因为他们没有打字
    • 因为会话不稳定(不可靠)

    也就是说,您最了解您的应用和架构。你必须做出决定并支持他们。尽管我是纯粹主义者,但我认为最佳实践不是宗教,而是宗教。情况各不相同。