簡體   English   中英

ASP.NET MVC - HybridViewResult(ViewResult / PartialViewResult)

[英]ASP.NET MVC - HybridViewResult (ViewResult /PartialViewResult)

是否有可能構建一個混合的ViewResult,它返回AjaxRequest或HttpRequest的一個PartialViewResultViewResult

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

據我所知,我的HybridViewResult應該派生自ViewResultBase。

但是如何實現FindView方法呢?

嘗試:

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變量,即傳遞Model。

對於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);
        }
    }
}

我知道我在這里參加派對的時間已經很晚了,但這些對我來說似乎不對,所以這是我的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);
}

返回視圖的任何操作方法都會在請求時自動返回partials:

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();
}

在這種情況下,你不能只做兩個不同的行動嗎? 您可以簡單地將[nonAction]共享]邏輯放入[nonAction]方法中?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM