2017-06-20 49 views
0

我有一個名爲BaseController的控制器。在BaseController中,我有一個名爲Index的Action方法,它有一些涉及查詢路由和構建URL的邏輯。對東西的線路:MVC路線數據不可用

var link = Url.RouteUrl("myroute", new { id = 5 }); 

這一切都很好,很好,直到我創建一個控制器NewController,它擴展了BaseController。在NewController的構造函數中,我將BaseController作爲依賴項傳遞。

public class NewController 
{ 
    private BaseController _baseController; 

    public NewController(BaseController baseController) 
    { 
    _baseController = baseController; 
    } 

    public ActionResult Index() 
    { 
    return _baseController.Index(); 
    } 
} 

這是需要的原因是因爲我需要重寫視圖(一些HTML和CSS更改)。我不想重新創建模型和服務並重寫業務邏輯,所以認爲這將是最好和最有效的方法。

唯一的問題是當BaseController的索引動作被調用時,Url顯然爲空。路由數據不可用,因爲請求是在基本控制器之外生成的。

解決此問題的最佳方法是什麼?

+0

你解決了這個問題嗎? – hasan

回答

0

您正試圖從另一個控制器調用操作方法。 propably你的構造函數方法獲取baseController爲null。你可以嘗試實現它像下面

public ActionResult Index() 
{ 
    return new BaseController().Index(); // assume you call index action 
} 

或者你也可以從另一個控制器調用BaseController動作像如下

public ActionResult Index() 
{ 
    return RedirectToAction("Index", "Base"); // assume you call index action 
} 

你也可以改變路線網址類似以下。

@Url.RouteUrl("myroute", new { controller = "Base", action = "Index", id = 5 }) 
+0

調用該方法不是問題。路由數據爲空,因爲請求是在基本控制器之外生成的。 – novicecoder

+0

你檢查過baseController變量是否在運行時爲空?並且你可以共享代碼部分,你調用BaseController – hasan

+0

你嘗試使用@ Url.RouteUrl(「myroute」,新的{controller =「Base」,action =「Index」,id = 5)) – hasan

0

BaseController.Index()虛擬:

public class BaseController : Controller 
{ 
    public virtual ActionResult Index() 
    { 
     return View(); 
    } 
} 

然後使用繼承:

public class NewController : BaseController 
{ 
    public override ActionResult Index() 
    { 
     var index = base.Index(); 
     //do whatever 
     return index; 
    } 
} 
+0

調用方法不是一個問題。路由數據爲空,因爲請求是在基本控制器之外生成的。 – novicecoder

+0

爲什麼你不會在混凝土控制器內調用路線數據? – mxmissile

0

我有需要的代碼設計的努力一點點另一種解決方案。

你爲什麼不摘要你的業務邏輯遠離兩個Controllers

例如:RouteBuilder.cs一個具有包含構建路線邏輯的函數的類。

BaseClass.cs是一個包含兩個控制器之間共享的邏輯的類。

然後:

public class BaseController 
{ 
    public ActionResult Index() 
    {`` 
     //Instantiase BaseClass.cs and call the needed functions. Then RouteBuilder.cs and call functions. 
     return View(); 
    } 
} 


public class NewController 
{ 
    public ActionResult Index() 
    {`` 
     //Instantiase BaseClass.cs and call the needed functions. 
     return View(); 
    } 
} 

中提琴。解決問題並生成乾淨的代碼。