MVC3 Custom ActionResult - PullRequest
       17

MVC3 Custom ActionResult

0 голосов
/ 03 апреля 2012

Большая часть моего простого содержимого находится в базе данных, доступ к которой осуществляется с помощью пользовательской 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 ]

2 голосов
/ 03 апреля 2012

Вы можете иметь один файл вида и ссылаться на этот файл вида из нескольких действий:

public class FooBarController : Controller { 

    public ViewResult Foo() { 

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

В этом случае вы сможете визуализировать представление с путем ~ / Views / Shared / FooView.cshtml (если, конечно, вы не переопределите соглашение по умолчанию).

Edit:

Как вы указали, вы можете создать собственный 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();
}
0 голосов
/ 23 июля 2012

для получения более подробной информации о создании собственного результата действия перейдите по ссылке: - http://www.professionals -helpdesk.com / 2012/06 / создать-пользовательский-ActionResult-в-Mvc-3.html

...