MVC3自定义ActionResult

时间:2012-04-03 11:01:25

标签: asp.net asp.net-mvc-3 actionresult

我的很多简单内容都在数据库中,由自定义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将找到相对于操作和控制器名称的内容密钥,转到数据库并检索内容并在其主视图中显示它,不需要物理文件视图。这可能吗?

2 个答案:

答案 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