跨多个控制器操作保持值

时间:2013-04-24 09:10:19

标签: asp.net-mvc-3 episerver

在我的控制器中,我有一个数据库中的对象的ID,并且多个操作需要此id来访问该对象。此ID在Index操作中获取,用于填充视图模型。我获取ID的方式是通过一个参数,EPiServer(在CMS之外)传递Index动作,所以我无法在其他任何地方获得它。

我的问题是,如果没有在客户端使用隐藏字段等,有没有办法让我的操作可以访问此ID?

我希望避免尽可能多地发送额外数据,这不是一个很好的解决方案。

2 个答案:

答案 0 :(得分:4)

我不确定你的意思是“这不是一个好的解决方案”,因为使用隐藏字段可能是在多个帖子中保存数据的最简洁方法。请记住,HTTP是 - 并且应该被视为 - 无状态协议。还有一些其他选择:

<强>缓存

将值添加到控制器中的cookie并将其添加到Response对象。然后,选择它并在需要时使用Request.Cookies读取它。

/* Setting */
Response.Cookies["id"].Value = "myId";

/* Getting */
var id = Request.Cookies["id"] != null
    ? Request.Cookies["id"].Value
    : String.Empty;

优点:坚持多个请求,而无需在请求之间执行任何操作。

缺点:轻松关闭客户端。

会话状态

使用Session集合将值添加到会话状态。

/* Setting */
Session["id"] = "myId";

/* Getting */
var myId = Session["id"] != null ? Session["id"].ToString() : String.Empty;

优点:易于使用,可以在多个请求中保留

缺点:如果用户打开多个标签,使用“后退”按钮等,可能会非常混乱。通常无法预测。

隐藏字段

将值添加到隐藏字段,并在下一次POST时备份该值。

/* View (assuming string model property 'Id') */
@Html.BeginForm("MyAction", "MyController")
{
    @Html.HiddenFor(m => m.Id)
    <input type="submit" value="Submit" />
}

/* Controller */
public ActionResult MyAction(MyModel model)
{
    var id = model.Id;
}

优点:没有足迹。干净,简单,无状态,高效。

缺点:对于持久化GET请求没有好处。只能一次持续一个POST。

查询字符串

在重定向上将值作为查询字符串参数添加。

/* View */
@Html.ActionLink("Go!", "MyAction", new { identifier = "myId" })

/* Controller */
public ActionResult MyAction(string identifier)
{
    var id = identifier ?? String.Empty;
}

优点:与隐藏字段不同,可用于GET请求。

缺点:要求您实现一种方法,将查询字符串保存在您需要值的所有请求中。

什么是最好的?

我个人认为 - 在你的情况下 - 使用cookies可能是最好的选择。如果你想要在多个请求中持久化而不必处理每个请求中的值(并且没有使用Session的可怕性),那么cookie可能是最简单和最好的方法。

答案 1 :(得分:0)

我通常会在表格中为这样的场景寻找隐藏的输入,但如果您不愿意,可以使用Cookie或会话。