4

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

我的问题是,有没有办法让我的操作可以访问这个 ID,而无需在客户端使用隐藏字段等?

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

4

2 回答 2

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 请求。

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

什么是最好的?

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

于 2013-04-24T09:25:48.893 回答
0

对于这种情况,我通常会在表单中隐藏输入,但如果您不愿意,您可以使用 Cookies 或 Sessions。

于 2013-04-24T09:23:39.123 回答