2015-02-10 74 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());