2011-07-20 19 views
2

这里是我的模型:我怎样才能保持(asp.net的MVC)的行动之间模型的属性

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我可以很容易地修改model.BaseTypeField用的HtmlHelper,但我不想修改model.UserTypeField在该视图(我也不能存放在HiddenFor)。 然后Action1View提交模式到另一个动作:

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

这里谈到的问题:我如何才能保持/保存model.UserTypeField除了类似会议?

+0

为什么你不能把它放在一个隐藏字段? – hatchet

+0

防止隐藏字段丢失的唯一方法是:<%= Html.HiddenFor(o => o.UserTypeField.EveryFieldInUserField.MaybeSomeOthers)%>。这太烦人了吗? – rhapsodyn

回答

0

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

0

你有多种选择,以保持状态跨越控制器操作:

  1. 它储存在查看隐藏的输入元素(虽然我明白,你说你不能,并有大量的很好的理由可能是这种情况)。
  2. 将其存储在会话状态。
  3. 存储在你的应用程序数据库(但后来,你不妨使用会话状态)。
  4. 将其存储在cookie中。您可以创建一个HttpCookie并将其添加到Action1中的HttpContext.Current.Response.Cookies中,并从Action2中的HttpContext.Current.Request.Cookies中读取它。

如果您只有少量数据,并且没有理由在其他地方使用会话状态,我可能会选择cookie选项。但会话状态正是出于这种目的。如果它是正确的,不要害怕使用它。

+0

在我的情况下,我如何将它存储在隐藏? <%= Html.HiddenFor(o => o.UserTypeField)%>原来在Action2(model.UserTypeField == null)== true – rhapsodyn

0

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

这可能看起来像很多工作要做的每一步,但你将不必做所有的验证,而您不希望更改的所有字段保存自己很多头痛的问题。如果将其包含在函数中,则可以轻松地从数据存储中加载模型的其余部分。

0

的TempData []旨在保持动作之间的项目,但它使用的会话。如果按键没有用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(); 
} 
相关问题