asp.net-mvc-3 - 跨多个 Controller 操作保持值

标签 asp.net-mvc-3 episerver

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

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

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

最佳答案

我不确定您所说的“这不是一个很好的解决方案”是什么意思,因为使用隐藏字段可能是跨多个帖子持久化数据的最干净的方法。请记住,HTTP 是 - 并且应该被视为 - 无状态协议(protocol)。但是,还有一些其他选项需要考虑:

cookies

将值添加到 Controller 中的 cookie 并将其添加到 Response目的。然后,拿起它并在需要时使用 Request.Cookies 阅读。 .

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

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

优点:跨多个请求持续存在,而无需在其间的请求中执行任何操作。

缺点:轻松关闭客户端。

session 状态

使用 Session 将值添加到 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 可能是最简单和最简洁的方法。

关于asp.net-mvc-3 - 跨多个 Controller 操作保持值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187983/

相关文章:

asp.net-mvc-3 - 无法在 ASP.NET MVC3 的局部 View 中访问 ViewData

episerver - EPiServer 中发布的内容上的 ForceCurrentVersion 出现奇怪行为

asp.net-mvc - 如何在扩展方法中使用 HTML 帮助器方法?

c# - 每 4 次循环新表行

asp.net-mvc-3 - 在 Action 过滤器中获取 Action 参数的值

asp.net - 如何限制对 Azure 上运行的网站部分的访问

c# - EpiServer - 我如何才能知道某个 block 是否正在任何已发布的页面上使用?

c# - 使用 .NET 4 MVC 3 和 jQuery 更新 DIV

c# - 使用 log4net 的正确方法(记录器命名)

c# - EPiServer 9 : Is there any real alternative for EPiServer ContentArea Contents?