3

是否可以构建一个混合 ViewResult 来返回依赖 AjaxRequest 或 HttpRequest aPartialViewResultViewResult

IsAjaxRequest --> 返回 PartialViewResult !IsAjaxRequest --> 返回 ViewResult

据我所知,我的 HybridViewResult 应该来自 ViewResultBase。

但是如何实现 FindView 方法呢?

4

4 回答 4

2

这是对 eglasius 答案的稍微精简的看法。我实际上正在解决一个类似的问题,除了我需要返回一个 JsonResult。

(未经测试的) NormalOrAjaxResult 只是让您为非 ajax 请求指定一个操作结果,为 ajax 请求指定一个操作结果。因为这些是 ActionResults,您可以混合 Redirect、View、Partial 和 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);
        }
    }
}
于 2010-09-17T10:42:08.553 回答
2

尝试:

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
    }
}

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

于 2010-09-17T09:48:28.380 回答
1

我知道我在这里参加聚会真的很晚了,但这些对我来说似乎不太合适,所以这是我的 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());

然后在你的控制器中,如果你覆盖 View

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();
}
于 2014-03-14T20:00:11.153 回答
1

在那种情况下,你不能只做两个不同的动作吗?您可以简单地将“共享”逻辑放入[nonAction]方法中吗?

于 2010-09-17T09:12:47.777 回答