我的所有观点都有这样的_ViewStart:
@{
if (!Request.IsAjaxRequest())
{
Layout = "~/Views/Shared/_Layout.cshtml";
}
}
我需要为每个非Ajax请求生成一个唯一的Guid,我需要在我的所有操作上访问Guid。
它将用于添加/访问Session变量以避免交叉表并发。
我该怎么做?
答案 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());