首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查返回视图是PartialViewResult类型还是ViewUserControl类型

如何检查返回视图是PartialViewResult类型还是ViewUserControl类型
EN

Stack Overflow用户
提问于 2010-03-21 15:50:14
回答 2查看 3.3K关注 0票数 0

在方法CreateView()中(在下面检查我的视图引擎)或在我的自定义操作过滤器中(也在下面),我必须以某种方式检查我们请求的视图是否是ViewUserControl。因为否则我会说错话

“当视图是ViewUserControl时不能指定主名称”

当我在modal=true中有“QueryString”时,视图请求是ViewUsercontrol,因为您不能在ViewUserControls上设置母版页(很明显)。

这是我现在的自定义视图引擎代码:

代码语言:javascript
复制
    public class PendingViewEngine : VirtualPathProviderViewEngine
    {
        public PendingViewEngine()
        {
            // This is where we tell MVC where to look for our files. 
            /* {0} = view name or master page name       
             * {1} = controller name      */
            MasterLocationFormats = new[] {"~/Views/Shared/{0}.master", "~/Views/{0}.master"};
            ViewLocationFormats = new[]
                                    {
                                        "~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx",
                                        "~/Views/{1}/{0}.ascx"
                                    };
            PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"};
        }

        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        {
            return new WebFormView(partialPath, "");
        }

        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        {
            return new WebFormView(viewPath, masterPath);
        }
}

我的行动过滤器:

代码语言:javascript
复制
public class CanReturnModalView : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // setup the request, view and data
        HttpRequestBase request = filterContext.RequestContext.HttpContext.Request;

        bool modal = false;

        if (request.QueryString["modal"] != null)
            modal = bool.Parse(request.QueryString["modal"]);

        if (filterContext.Result is ViewResult)
        {
            ViewResult view = (ViewResult) (filterContext.Result);

            // replace the view Master page file with Modal Masterpage
            if (modal)
                view.MasterName = "AdministrationModal";

            filterContext.Result = view;
        }
        else if (filterContext.Result is RedirectToRouteResult)
        {
            RedirectToRouteResult redirect = (RedirectToRouteResult) filterContext.Result;
            // append modal route value to the redirect result if modal was requested
            if (modal)
                redirect.RouteValues.Add("modal", true);

            filterContext.Result = redirect;
        }
    }
}

上面的ViewEngine在这样的调用中失败:

代码语言:javascript
复制
<% Html.RenderAction("Display", "MyController", new { zoneslug = "some-zone-slug" });%>

我在这里所做的动作是:

代码语言:javascript
复制
        public ActionResult Display(string zoneslug)
        {
            WidgetZone zone;

            if (!_repository.IsUniqueSlug(zoneslug))
                zone = (WidgetZone) _repository.GetInstance(zoneslug);
            else
            {
// do something here
            }

// WidgetZone used here is WidgetZone.ascx, so a partial
            return View("WidgetZone", zone);
        }

我不能使用RenderPartial,因为您不能以向RenderPartial发送路由值的方式将路由值发送到RenderAction。据我所知,没有办法像RouteValueDictionary ()那样向RenderPartial()提供RenderAction()。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-13 08:08:52

您可以通过调用PartialView而不是视图来实现所描述的行为:

像现在一样创建视图

代码语言:javascript
复制
  <% Html.RenderAction("PartialIndex", new { test = "input" }); %>

如你所见,它没有什么特别之处。

然后,在控制器操作中,只需调用PartialView而不是View:

代码语言:javascript
复制
public ActionResult PartialIndex(string test)
{
    var viewResult = PartialView("PartialIndex", (object)test);
    return viewResult;
}

并重写视图方法,以便在将模态参数传递到查询字符串时重写主名称。

代码语言:javascript
复制
public bool IsModal
{
    get
    {
        var modalParameter = Request.QueryString["modal"];

        if (string.IsNullOrEmpty(modalParameter))
            return false;

        bool modalValue;
        var success = bool.TryParse(modalParameter, out modalValue);

        return success && modalValue;
    }
}

protected override ViewResult View(string viewName, string masterName, object model)
{
    if (IsModal)
        masterName = "Alternate";
    return base.View(viewName, masterName, model);
}

只有在呈现实际视图(而不是部分视图)时,视图方法才会被覆盖,因此可以安全地假定可以设置masterName。

票数 5
EN

Stack Overflow用户

发布于 2010-03-21 17:04:52

试试这个(未经测试)。FindView返回一个ViewEngineResults,该ViewEngineResults具有一个名为IView View的属性,该属性可以是PartialViewResult。如果不存在,只需检查并返回并使用空主。

代码语言:javascript
复制
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
    if( base.FindView(controllerContext, viewName, "", useCache).View is PartialViewResult )
        return base.FindView(controllerContext, viewName, "", useCache);

    if (controllerContext.HttpContext.Request.IsAjaxRequest())
        return base.FindView(controllerContext, viewName, "Modal", useCache);

    return base.FindView(controllerContext, viewName, "Site", useCache);
} 

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2487649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档