我的很多简单内容都在数据库中,由自定义CMS访问。在应用程序周围,我显示简单的“谢谢”消息等,其中包含控制器操作(简化):
public ActionResult DetailsUpdated()
{
return View();
}
和我的观点:
@Html.GetContent("DetailsUpdated")
我有很多这些并且非常讨厌有很多带有单行的视图文件。我希望能够将该内容作为视图返回,我可以return ContentResult(ContentRepository.GetContent("KEY"));
但是这会返回作为纯文本,并且没有渲染主视图。
因此,基本上,通过ContentRepository.GetContent("KEY")
从数据库中获取内容(返回一个字符串)并将其注入主视图,其中调用RenderBody()。我想要一个自定义的ActionResult,所以我可以这样做:
public ActionResult DetailsUpdated()
{
return DbContentResult();
}
然后DbContentResult
ActionResult将找到相对于操作和控制器名称的内容密钥,转到数据库并检索内容并在其主视图中显示它,不需要物理文件视图。这可能吗?
答案 0 :(得分:2)
您可能有一个视图文件,并从多个操作中引用该视图文件:
public class FooBarController : Controller {
public ViewResult Foo() {
return View("FooView", ContentRepository.GetContent("KEY"));
}
}
在这种情况下,您将能够呈现其路径为〜/ Views / Shared / FooView.cshtml 的视图(除非您当然覆盖默认约定)。
修改强>
正如您所指出的,您可以制作一个自定义ViewResult来为您执行此操作:
public class DbContentResult : ViewResult {
public DbContentResult() {
this.ViewName = "FooView";
this.ViewData.Model = "Foo Model";
}
}
用法:
public ActionResult Index() {
return new DbContentResult();
}
甚至更好,为Controller
类编写一个与DbContentResult
集成的扩展方法:
public static class ControllerExtensions {
public static ViewResult DbContentResult(this Controller controller) {
return new DbContentResult();
}
}
用法:
public ActionResult Index() {
return this.DbContentResult();
}
答案 1 :(得分:-2)
有关创建自定义actionresult的更多详细信息,请转到此处: - http://www.professionals-helpdesk.com/2012/06/create-custom-actionresult-in-mvc-3.html