2015-02-10 66 views
1

每个非Ajax请求一个唯一的GUID我所有的观点有一个这样的_ViewStart:产生MVC的

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

我需要生成一个唯一的GUID每个非Ajax请求,我需要访问该GUID在我所有的行动。

它将用于添加/访问会话变量以避免交叉标签并发。

我该怎么做?

+0

:最有可能你需要使用一个全球行动过滤器:

[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? – 2015-02-10 16:04:03

+0

我这么认为,用基本形式认证 – Paul 2015-02-10 16:06:02

+0

@Paul:那么,不,你没有使用OWIN。表单身份验证不兼容。 – 2015-02-10 20:19:53

回答

1

你必须通过这个周围,这将是非常脆弱的。基本上,每个表单都必须有一个隐藏的输入,您可以填充此值,并且每个链接都必须将此值附加为查询字符串。如果你甚至忘记这么做了,那么价值将无法挽回。

形式

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

链接

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

然后,你需要的东西为自己的行为来设置这个值,如果它不存在。您使用的OWIN

filters.Add(new AddGuidAttribute());