2012-04-03 62 views
0

很多我的普通內容都在數據庫中,可以通過自定義的CMS訪問。我周圍顯示簡單應用「謝謝」的消息等,這些由一個控制器動作(簡體)的:MVC3自定義ActionResult

public ActionResult DetailsUpdated() 
{ 
    return View(); 
} 

和我的觀點:

@Html.GetContent("DetailsUpdated") 

我有不少的這些和它非常煩人,有很多單行視圖文件。我希望能夠將該內容作爲視圖返回,我可以做return ContentResult(ContentRepository.GetContent("KEY"));,但是這會以純文本格式返回,並且沒有呈現主視圖。

所以,基本上,通過ContentRepository.GetContent("KEY")(返回一個字符串)從DB獲取內容並將其注入到主視圖中,RenderBody()被調用。我想有一個自定義的ActionResult這樣我就可以這樣做:

public ActionResult DetailsUpdated() 
{ 
    return DbContentResult(); 
} 

,然後DbContentResult的ActionResult會發現內容密鑰相對於動作和控制器的名稱,訪問數據庫和檢索的內容和顯示它在主視圖內,不需要物理文件視圖。這可能嗎?

回答

2

你可能有一個視圖文件,並從幾個動作指的是視圖文件:

public class FooBarController : Controller { 

    public ViewResult Foo() { 

     return View("FooView", ContentRepository.GetContent("KEY")); 
    } 
} 

在這種情況下,你將能夠呈現的路徑是〜/查看/共享/ FooView視圖.cshtml(除非你重寫當然的默認約定)。

編輯:

正如你指出,你可以做一個自定義的ViewResult它可以實現這個要求:

public class DbContentResult : ViewResult { 

    public DbContentResult() { 

     this.ViewName = "FooView"; 
     this.ViewData.Model = "Foo Model"; 
    } 
} 

用法:

public ActionResult Index() { 

    return new DbContentResult(); 
} 

甚至更​​好,寫與DbContentResult集成的Controller類的擴展方法:

public static class ControllerExtensions { 

    public static ViewResult DbContentResult(this Controller controller) { 

     return new DbContentResult(); 
    } 
} 

用法:

public ActionResult Index() { 

    return this.DbContentResult(); 
} 
+0

沒錯很好的答案。我重新使用一些視圖來顯示整個信息表的不同控制器操作。主要是因爲它們顯示相同的對象類型,因此代碼非常相似。稍微調整一下,你可以重用alsorts,特別是使用partials和if語句。 – Doomsknight 2012-04-03 13:01:30

+0

從來沒有想過這樣做,我想這會工作,但有沒有像我建議的那樣做的任何方式? – eth0 2012-04-05 08:09:12

+0

@ eth0編輯了答案。一探究竟。 – tugberk 2012-04-05 08:54:19