我不确定你所说的“这并不是一个很好的解决方案”是什么意思,因为使用隐藏字段可能是跨多个帖子保存数据的最干净的方法。请记住,HTTP 是并且应该被视为无状态协议。不过,还有一些其他选项需要考虑:
Cookies
将值添加到控制器中的 cookie 并将其添加到Response
目的。然后,在需要时拿起它并阅读它Request.Cookies
.
/* Setting */
Response.Cookies["id"].Value = "myId";
/* Getting */
var id = Request.Cookies["id"] != null
? Request.Cookies["id"].Value
: String.Empty;
Pros:跨多个请求保持不变,而无需在请求之间执行任何操作。
Cons:轻松关闭客户端。
会话状态
使用以下命令将值添加到会话状态Session
收藏。
/* Setting */
Session["id"] = "myId";
/* Getting */
var myId = Session["id"] != null ? Session["id"].ToString() : String.Empty;
Pros:易于使用,跨多个请求持续存在
Cons:如果用户打开多个选项卡、使用“后退”按钮等,可能会变得非常混乱。通常是不可预测的。
隐藏字段
将值添加到隐藏字段,并在下一个 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;
}
Pros:没有足迹。干净、简单、无状态且高效。
Cons:对于跨 GET 请求进行持久化没有好处。一次仅在一个 POST 中持续存在。
请求参数
将值添加为重定向上的查询字符串参数。
/* View */
@Html.ActionLink("Go!", "MyAction", new { identifier = "myId" })
/* Controller */
public ActionResult MyAction(string identifier)
{
var id = identifier ?? String.Empty;
}
Pros:与隐藏字段不同,可用于 GET 请求。
Cons:要求您实现一种方法,在需要其值的所有请求中保留查询字符串。
什么是最好的?
就您个人而言,我想说 - 就您而言 - 使用 cookie 可能是最好的选择。如果您想在多个请求之间持久保留,而不必处理每个请求中的值(并且没有使用的可怕之处)Session
),cookie 可能是最简单、最简洁的方法。