2012-04-03 59 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