C# ASP.NET MVC:如何在操作筛选器中访问视图名称
我已经写了下面的模型验证操作过滤器-C# ASP.NET MVC:如何在操作筛选器中访问视图名称,c#,asp.net,asp.net-mvc,action-filter,C#,Asp.net,Asp.net Mvc,Action Filter,我已经写了下面的模型验证操作过滤器- public override void OnActionExecuting(ActionExecutingContext filterContext) { var viewData = filterContext.Controller.ViewData; var viewNme = filterContext.Controller; if (!viewData.ModelState.IsVal
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var viewData = filterContext.Controller.ViewData;
var viewNme = filterContext.Controller;
if (!viewData.ModelState.IsValid)
{
filterContext.Result = new ViewResult
{
ViewData = viewData,
ViewName = "Test"
};
}
base.OnActionExecuting(filterContext);
}
如果我没有通过ViewName=“WhitePaper”
它将失败,并显示以下消息-
“/Travelers.eBusiness.Travelers.Web”应用程序中出现服务器错误
找不到视图“索引”或其主视图,或者没有视图引擎支持搜索的位置。搜索了以下地点:
我的问题是—
如何传递视图信息 您可以在
OnActionExecuted
事件中获取结果的视图名称
这将为您提供视图名称
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var viewData = filterContext.Controller.ViewData;
var view = filterContext.Result as ViewResultBase;
if (view != null)
{
string viewName = view.ViewName;
// If we did not explicitly specify the view name in View() method,
// it will be same as the action name. So let's get that.
if (String.IsNullOrEmpty(viewName))
{
viewName = filterContext.ActionDescriptor.ActionName;
}
// Do something with the viewName now
}
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var actionMethodName = filterContext.ActionDescriptor.ActionName;
// This will be same as your view name if you are not explicitly
// specifying a different view name in the `return View()` call
}
执行操作方法后,filterContext.Controller.ViewData
将可用(非空)。但是如果您想在<代码> OnAction Reals事件中,您可能会考虑读取动作名称并使用它(假设您的动作方法正在返回一个视图而不显式指定视图名)。
是否要获取当前操作方法的视图名称?是的,我希望视图名称可能重复:这不能解决问题。此筛选器用于模型验证。此处返回的视图名称是重定向页面的名称。我们正在
return view()
调用中指定不同的视图名称。因此,在执行该方法之前,您无法获取视图名称,因为您的操作方法可以根据某些条件返回任何视图。