加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-2 – 在ASP.Net MVC 2中的整个站点中保持查询字符串

发布时间:2020-12-16 09:57:56 所属栏目:asp.Net 来源:网络整理
导读:HTTP:www.site1.com/ SID = 555 我希望能够保持sid参数和值,无论是发布表单还是单击链接. 如果用户导航到实现分页的视图,则应在sid之后添加查询字符串中的其他参数. ?HTTP:www.site1.com/ SID = 555安培;页= 3 我怎样才能在Asp.Net Mvc 2中实现这一目标?
HTTP:www.site1.com/ SID = 555

我希望能够保持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

这个问题与Dave提到的不同,因为查询字符串参数在整个站点中持续存在.

解决方法

首先,我要说的是,如果值需要在整个会话期间保持不变,那么您应该将其存储在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();
}

注意

当查询值进入会话时,它将应用于会话的生命周期.如果要检查值是否存在且每个请求都相同,则需要在属性覆盖方法中进行一些检查.

最后

我纯粹是把它做成“可以做到”的练习.我强烈建议不要这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读