2010-09-17 29 views
3

是否有可能構建一個混合的ViewResult,它依賴於AjaxRequest或HttpRequest返回PartialViewResultViewResultASP.NET MVC - HybridViewResult(ViewResult/PartialViewResult)

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

據我知道我的HybridViewResult應該ViewResultBase派生。

但是如何實現FindView方法?

+0

爲什麼不只是有方法返回不同類型取決於''IsAjaxRequest'的ActionResults':,你返回一個視圖請求時,會自動復回諧音的任何行動方法? – bzlm 2010-09-17 09:17:54

+0

我在這一方的OP方面,我喜歡返回新的HybridViewResult()。也許命名需要一些工作。 – eglasius 2010-09-17 09:53:48

回答

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變化根據需要即傳遞模型。

+0

當沒有指定視圖名稱時是否必須手動獲取視圖名稱,或者ASP.NET MVC是否自動獲取視圖名稱? – Rookian 2010-09-17 11:02:35

+0

afaik是從ControllerContext /路由值(即動作).ExecuteResult中確定的,所以是的 - 但我沒有測試過它。 /這段代碼是基於我所知道的所有這些作品而來的。 – eglasius 2010-09-17 11:09:00

1

在這種情況下,你不能僅僅做出2種不同的動作嗎? '共享'的邏輯,你可以簡單地把一個[nonAction]方法?

+0

我不介意你,你能詳細解釋一下你的想法嗎? – Rookian 2010-09-17 09:18:00

2

這是對eglasius的答案稍微剝離下來。實際上我正在處理類似的問題,除了我需要返回一個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); 
     } 
    } 
} 
+0

+1雖然我個人喜歡返回新的HybridViewResult()多於返回HybridViewResult(View(),PartialView())。此外,與控制器的基地,它可以返回HybridView():) – eglasius 2010-09-17 10:47:16

+0

HybridViewResult看起來更好看,雖然與NormalOrAjaxResult你有一個更明確的指示返回什麼。 – Castrohenge 2010-09-17 10:52:18

+0

,但它仍然可以命名爲NormalOrAjaxResult並自動執行/或在此情況下爲NormalOrPartialViewResult。 – eglasius 2010-09-17 11:11:09

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

然後在您的控制器中,如果您覆蓋查看

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