在我的控制器中,我有一个数据库中的对象的ID,并且多个操作需要此id来访问该对象。此ID在Index
操作中获取,用于填充视图模型。我获取ID的方式是通过一个参数,EPiServer(在CMS之外)传递Index
动作,所以我无法在其他任何地方获得它。
我的问题是,如果没有在客户端使用隐藏字段等,有没有办法让我的操作可以访问此ID?
我希望避免尽可能多地发送额外数据,这不是一个很好的解决方案。
答案 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或会话。