2010-05-14 85 views
4

HTTP:www.site1.com/ SID = 555查询字符串坚持整个网站的参数在ASP.Net MVC 2

我希望能够有SID参数和值持续表单是否发布或链接被点击。

如果用户导航到实现分页的视图,则查询字符串中的其他参数应添加到sid后面。

HTTP:www.site1.com/ SID = 555 &页= 3

我怎样才能在Asp.Net MVC 2做到这一点?

[编辑]

我在上面提到的将是应用程序的入口点的URL,这样的SID将被包含在链接。

在像应用程序链接:

<%= Html.ActionLink("Detail", "Detail", new { controller = "User", 
               id = item.UserId })%> 

应该去:
HTTP:www.site1.com/user/detail/3 SID = 555

这个问题是不是有什么不同戴夫提到,因为查询字符串参数在整个站点中持续存在。

+0

可能重复[你如何在asp.net mvc中持续查询字符串值?](http://stackoverflow.com/questions/889732/how-do-you-persist-querystring-values-in-asp-net -mvc) – mathieu 2012-05-15 12:06:47

回答

1

可能重复:

How do you persist querystring values in asp.net mvc?

我接受的答案上面链接的问题达成一致。查询字符串参数不是为数据持久性设计的。如果设置(即sid = 555)旨在通过会话保留,请使用会话状态或您的模型来保存该数据,以便跨请求使用。

3

首先,我想说如果值需要在整个会话中保持,那么你应该将它存储在会话中,并检查它在每个动作调用中仍然有效。这可以通过添加到控制器/所需操作的自定义操作属性完成。如果需要该值,则在检查该值时,可以重新设置为登录页面或类似(如果不存在或已过期)。

无论如何,这说我想我会得到它的工作裂缝。我的第一个想法是创建一个自定义操作筛选器属性,它使用查询字符串的值并将其存储在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的extention方法你自己的其中一个增加的价值。

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(); 
} 

注意

由于查询值被放入会议将FO应用会议的生命。如果你想检查值是否存在,并且每个请求都相同,你需要在属性重写方法中进行一些检查。

最后

我已经做纯粹这是一个“能不能做到”演习。我强烈建议不要这样做。

相关问题