在Mvc上的每个非Ajax请求中生成唯一的guid

时间:2015-02-10 16:02:05

标签: c# asp.net-mvc

我的所有观点都有这样的_ViewStart:

@{
   if (!Request.IsAjaxRequest())
   {
      Layout = "~/Views/Shared/_Layout.cshtml";
   }
}

我需要为每个非Ajax请求生成一个唯一的Guid,我需要在我的所有操作上访问Guid。

它将用于添加/访问Session变量以避免交叉表并发。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

你必须传递它,它将非常脆弱。基本上,每个表单都必须有一个隐藏的输入,您可以填充此值,并且每个链接都必须将此值作为查询字符串附加。如果你忘记这样做一次,那么价值就会无可挽回地失去。

<强>表单

@Html.Hidden("guid", Request["guid"])

<强>链接

@Html.ActionLink("SomeAction", new { guid = Request["guid"] })

然后,如果不存在,您需要为您的操作设置此值。您很可能想要使用全局操作过滤器:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class AddGuidAttribute : FilterAttribute, IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext filterContext) 
    {
        var request = filterContext.RequestContext.HttpContext.Request;
        if (request["guid"] == null)
        {
            var builder = new UriBuilder(request.RawUrl);
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
            query["guid"] = Guid.NewGuid();
            builder.Query = query.ToString();
            filterContext.Result = new RedirectResult(builder.ToString());
        }
    } 
}

然后在FilterConfig.cs

filters.Add(new AddGuidAttribute());