如何在动作之间保存模型的属性(asp.net mvc)

时间:2011-07-20 12:38:57

标签: asp.net asp.net-mvc model

这是我的模特:

public class MyModel
    {
        public int BaseTypeField { set; get; }

        public MyType UserTypeField { set; get; }
    }

在第一个操作中,我通常将MyModel传递给视图:

public ActionResult Action1()
    {
        MyModel model = new MyModel();
        //do something with model.UserTypeField
        return View(model);
    }

在Action1View中,我可以使用HtmlHelper轻松修改model.BaseTypeField,但我不想在此视图中修改model.UserTypeField(我也不能将其存储在HiddenFor中)。 然后Action1View将模型提交给另一个动作:

public ActionResult Action2(MyModel model)
    {
        //model.UserTypeField is lost here
        return View();
    }

问题出现了:如何保存/保存model.UserTypeField,除了Session ??

之类的东西

4 个答案:

答案 0 :(得分:0)

好吧,如果您不想使用会话状态,那么您唯一的选择是将信息传递给客户端并让他将其传回给他的请求。你可以做到这一点的一种方法是使用cookie。另一种可能是使用隐藏的表单字段。您可以在对Action1的响应中包含该字段,浏览器会在请求中自动将其提交给Action2(假设您使用表单POST来调用该操作)。

答案 1 :(得分:0)

您可以通过多种方式在控制器操作中保留状态:

  1. 将它存储在视图中的隐藏输入元素中(虽然我很欣赏你说你做不到,并且有充分的理由说明为什么会出现这种情况)。
  2. 将其存储在会话状态中。
  3. 将其存储在您的应用程序数据库中(但是,您也可以使用会话状态)。
  4. 将其存储在Cookie中。您可以创建一个HttpCookie并将其添加到Action1中的HttpContext.Current.Response.Cookies中,并从Action2中的HttpContext.Current.Request.Cookies中读取它。
  5. 如果您只有少量数据并且没有理由在其他地方使用会话状态,我可能会选择cookie选项。但是会话状态正是出于这种目的。如果这是正确的话,不要害怕使用它。

答案 2 :(得分:0)

每个操作都应该有一个参数,该参数只包含您希望从请求中接受的字段的属性。应该再次从数据存储中加载对象的其余部分。换句话说,没有Action2采用一个接受整个模型的属性,因为它会让你的消费者无意中改变了比他们应该能够更多的属性。

这似乎在每一步都要做很多工作,但是你不必为所有你不想改变的字段进行所有验证,从而避免许多麻烦。如果将其包装在函数中,也可以很容易地从数据存储中加载模型的其余部分。

答案 3 :(得分:0)

TempData []用于在操作之间保存项目,但它确实使用Session。如果未使用Keep标记密钥,则在执行下一个Action后将删除它们。

如果您想避免Session fullstop,那么您必须序列化您的对象并将其发送到视图中的客户端(例如,在隐藏的表单变量中),然后将其反序列化为Action2。

如果您想使用TempData(除非您出于某种原因无法使用会话,否则最简单),语法只是:

public ActionResult Action1()
{
    MyModel model = new MyModel();
    //do something with model.UserTypeField

    TempData["UserTypeField"] = model.UserTypeField;

    return View(model);
}

public ActionResult Action2(MyModel model)
{
    model.UserTypeField = TempData["UserTypeField"];

    return View();
}