HTTP:www.site1.com/ SID = 555
我希望能够保持sid参数和值,无论是发布表单还是单击链接。
如果用户导航到实现分页的视图,则应在sid之后添加查询字符串中的其他参数。
HTTP:www.site1.com/ SID = 555&安培;页= 3
如何在Asp.Net Mvc 2中完成此操作?
[编辑]
我在顶部提到的网址是应用程序的入口点,因此sid将包含在链接中。
在应用程序链接中,例如:
<%= Html.ActionLink("Detail", "Detail", new { controller = "User",
id = item.UserId })%>
应该去:
HTTP:www.site1.com/user/detail/3 SID = 555
这个问题与Dave提到的不同,因为查询字符串参数在整个网站中都存在。
答案 0 :(得分:3)
首先,我要说的是,如果值需要在整个会话期间保持不变,那么您应该将其存储在Session中并检查它在每个动作调用中是否仍然有效。这可以通过添加到所需控制器/操作的自定义操作属性来完成。如果该值是必需的,那么当检查该值时,您可以重新登录到登录页面或类似内容(如果不存在或已过期)。
无论如何,那说我认为我会努力工作。我的第一个想法是创建一个自定义操作过滤器属性,该属性获取querstring的值并将其存储在OnActionExecuting
中的会话中,然后OnResultExecuted
将该键添加回查询字符串。但是,由于Request中的QueryString是只读集合,因此无法直接执行。
那么,现在可以使用什么?
选项#1 - 手动将其添加到对Html.ActionLink()的所有调用
或......
选项#2 - 覆盖ActionLink的一个版本,它会自动为您添加值。这可以像这样实现。我不建议这样做。
从自定义属性开始。
public class PersistQueryStringAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var sid = filterContext.RequestContext.HttpContext.Request.QueryString["sid"];
if (!string.IsNullOrEmpty(sid))
{
filterContext.RequestContext.HttpContext.Session["sid"] = sid;
}
base.OnActionExecuting(filterContext);
}
}
所有这一切都是检查所需密钥的请求查询字符串,如果可用,请将其添加到会话中。
然后,您将ActionLink扩展方法覆盖为您自己的一个,它将值添加到。
public static class HtmlHelperExtensions
{
public static MvcHtmlString ActionLink<TModel>(this HtmlHelper<TModel> helper, string text, string action, string controller, object routeValues)
{
var routeValueDictionary = new RouteValueDictionary(routeValues);
if (helper.ViewContext.RequestContext.HttpContext.Session["sid"] != null)
{
routeValueDictionary.Add("sid", helper.ViewContext.RequestContext.HttpContext.Session["sid"]);
}
return helper.ActionLink(text, action, controller, routeValueDictionary, null);
}
}
在每个要调用的动作上应用属性(或将其应用于控制器),例如:
[PersistQueryString]
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
注意强>
当查询值进入会话时,它将应用于会话的生命周期。如果要检查值是否存在且每个请求都相同,则需要检查属性覆盖方法。
<强>最后强>
我纯粹将其作为“可以做到”的练习。我强烈建议不要这样做。
答案 1 :(得分:1)
可能重复:
How do you persist querystring values in asp.net mvc?
我同意上面提到的问题的已接受答案。查询字符串参数不是为数据持久性而设计的。如果要在会话中保留设置(即 sid = 555 ),请使用会话状态或模型来保存该数据以供跨请求使用。