代码之家  ›  专栏  ›  技术社区  ›  Rookian

ASP.NET MVC-混合视图结果(ViewResult/PartialView结果)

  •  3
  • Rookian  · 技术社区  · 14 年前

    是否可以构建返回AjaxRequest或HTTPRequest A深度的混合视图结果 PartialViewResult ViewResult ?

    isajaxRequest-->返回partialView结果 !isajaxRequest-->返回viewResult

    据我所知,HybridViewResult应该从ViewResultBase派生。

    但是如何实现findView方法呢?

    4 回复  |  直到 14 年前
        1
  •  2
  •   eglasius    14 年前

    尝试:

    public class HybridViewResult : ActionResult
    {
        public string ViewName { get; set; }
        public HybridViewResult () { }
        public HybridViewResult (string viewName ) { this.ViewName = viewName ; }
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null) throw new ArgumentNullException("context");
            var usePartial = ShouldUsePartial();
            ActionResult res = GetInnerViewResult(usePartial);
            res.ExecuteResult(context);
        }
        private ActionResult GetInnerViewResult(bool usePartial)
        {
            var view = ViewName;
            ActionResult res;
            if(String.IsNullOrEmpty(view)) {
                 res = usePartial ? new PartialViewResult(view) : new ViewResult(view);
            }
            else {
                 res = usePartial ? new PartialViewResult() : new ViewResult();
            }
            return res;
        }
        private bool ShouldUsePartial(ControllerContext context) {
            return false; //your code that checks if you need to use partial here
        }
    }
    

    根据需要添加任何构造函数和getInnerView结果变体,即传递模型。

        2
  •  2
  •   Castrohenge    14 年前

    这是对埃格拉修斯答案的一个更为简单的理解。实际上,我正在处理一个类似的问题,只是需要返回一个JSonResult。

    (未测试)normalOraJaxResult只允许您为非Ajax请求和Ajax请求指定一个操作结果。因为这些是ActionResults,所以您可以混合使用重定向、视图、部分视图和JSON视图结果。

    public class NormalOrAjaxResult : ActionResult
    {
        private readonly ActionResult _nonAjaxActionResult;
        private readonly ActionResult _ajaxActionResult;
    
        public NormalOrAjaxResult(ActionResult nonAjaxActionResult, ActionResult ajaxActionResult)
        {
            _nonAjaxActionResult = nonAjaxActionResult;
            _ajaxActionResult = ajaxActionResult;
        }
    
        public override void ExecuteResult(ControllerContext context)
        {
            var isAjaxRequest = context.HttpContext.Request["isAjax"];
            if (isAjaxRequest != null && isAjaxRequest.ToLower() == "true")
            {
                _ajaxActionResult.ExecuteResult(context);    
            } else
            {
                _nonAjaxActionResult.ExecuteResult(context);
            }
        }
    }
    
        3
  •  1
  •   Stefanvds    14 年前

    在这种情况下,你不能只采取两种不同的行动吗?你可以简单地把“共享”逻辑 [nonAction] 方法?

        4
  •  1
  •   major-mann    10 年前

    我知道我参加聚会真的很晚了,但这些对我来说似乎不太合适,所以我的2分:

    public class PartialViewConverter : ViewResult
    {
        public ViewResultBase Res { get; set; }
        public PartialViewConverter(ViewResultBase res) { Res = res; }
        public override void ExecuteResult(ControllerContext context)
        {
            Res.ExecuteResult(context);
        }
        public static ViewResult Convert(ViewResultBase res)
        {
            return new PartialViewConverter(res);
        }
    }
    

    使用方法:

    return PartialViewConverter.Convert(PartialView());
    

    然后在控制器中,如果覆盖视图

    protected override ViewResult View(string viewName, string masterName, object model)
    {
        //Whichever condition you like can go here
        if (Request.QueryString["partial"] != null)
            return PartialViewConverter.Convert(PartialView(viewName, model));
        else
            return base.View(viewName, masterName, model);
    }
    

    返回视图的任何操作方法在被请求时也将自动返回部分:

    public ActionResult Index()
    {
        ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
    
        //This will return a partial if partial=true is passed in the querystring.
        return View();
    }