2016-04-14 55 views
1

在其中一個控制器中,每個視圖都有一個固定的預處理。有沒有更好的做法,而不是下面的代碼; SomeFunctionAsync作品無需寫入該行之前返回查看()所有功能與返回查看()在這個控制器?我也有一些ajax後期功能。在視圖控制器中放置通用代碼的位置查看函數?

public async Task<ActionResult> View1() 
{ 
    await SomeFunctionAsync(); 
    return View(); 
} 

public async Task<ActionResult> View2() 
{ 
    await SomeFunctionAsync(); 
    return View(); 
} 

換句話說,到了最後我希望能夠寫出下列與具有相同的效果

public async Task<ActionResult> View1() 
{ 
    return View(); 
} 

public async Task<ActionResult> View2() 
{ 
    return View(); 
} 
+0

控制器具有操作,而不是視圖。另外,你在問什麼? 「通用代碼」通常意味着提取方法並調用該方法。你問在哪裏存儲代碼,或者如何擺脫電話,爲什麼?例如,您可以創建過濾器,但這會增加複雜性 –

+0

我想擺脫呼叫。目前該功能是我的控制器中的一個專用功能。每個返回視圖的函數都應該調用它。 –

+0

您是否意識到您可以將視圖名稱傳遞給結果?一個動作可以使用不同的視圖呈現。而不是調用你的方法'View1','View2'你應該有一個實際上是一個動作的動作,例如'Create'並返回'返回View(「View1」)''或'返回View(「View2」)' –

回答

0

您可以爲您的控制器創建一個基類,並有各有看法在你的代碼中調用一個通用的方法。我使用GetView作爲方法名稱(或者您可以覆蓋現有的名稱)。

像這樣:

public class MyControllerBase : Controller { 

    public Task<ActionResult> GetView() { 
     yourCommonMethod(); 
     return View(); 
    } 

    public Task<ActionResult> GetView(string viewName) { 
     yourCommonMethod(); 
     return View(viewName); 
    } 

    public Task<ActionResult> GetView(object model) { 
     yourCommonMethod(); 
     return View(model); 
    } 


    public Task<ActionResult> GetView(string viewName, object model) { 
     yourCommonMethod(); 
     return View(viewName, model); 
    } 

} 

然後在你的控制器,從繼承:

public class MyController : MyControllerBase { 

    public async Task<ActionResult> View1() 
    { 
     return GetView(); 
    } 

} 

如果常用的方法是爲所有控制器一樣,沒有特定的控制器的依賴性,它可以那很簡單。不過,您也可以考慮使用泛型:

public class MyControllerBase<T> : Controller { 
    // base class stuff here based on type T's interface 
} 


public class MyController : MyControllerBase<MyController> { 
    // regular class here, sending MyController to the base 
} 

這些都是OOP的構建塊。你可能會做得很好,得到一本涵蓋面向對象基礎知識的書,並通過這種類型的東西來工作。

0

有牽引方式:

  1. 使用帶形迴流視圖(「視圖1」)不同的看法單一動作或retrun視圖(「視圖2」),你可以,如果其他條件有那麼你會在一個地方打電話給你的功能。

  2. 如果你想要去與你目前的程序(不推薦),那麼你必須用行動Filter屬性和裝飾它在控制器的水平,那麼每一個動作將你的行動執行前,執行邏輯

2

如果Varun建議的Action Filter不適合您,您可以嘗試其他方法。

創建一個父視圖的所有視圖。在父視圖的操作方法中。調用這個方法SomeFunctionAsync()。因此,將會調用父視圖來執行所有視圖,並且將執行所需的方法

相關問題