2010-02-01 6 views
1

У меня есть класс базового контроллера, и я бы хотел передать сообщение из базового класса ко всем контроллерам и чтобы это сообщение было доступно для всех представлений.Базовый класс контроллера

Я создал базовую версию ниже ...

Раздел Контроллер

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Website.Controllers 
{ 
    public class SectionController : Controller 
    { 
     // 
     // GET: /Section/ 

     public ActionResult Section() 
     { 
      ViewData["Message"] = "THIS IS A TEST"; 
      return View(); 
     } 

    } 
} 

Главная Контроллер

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Website.Controllers 
{ 
    public class HomeController : SectionController 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 
    } 
} 

Посмотреть

<%= Html.Encode(ViewData["Message"]) %> 

Я знаю, что могу это сделать в домашнем контроллере, но я просто тестирую в моменте.

Я не получаю никаких ошибок с вышеуказанным, но я также не показываю сообщение на моем представлении?

Я использую этот урок http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx Часть «Хорошее решение», если это помогает.

Подумайте я получил это работает в настоящее время используется код ниже на моем sectionController ...

namespace Website.Controllers 
{ 
    public class SectionController : Controller 
    { 
     // 
     // GET: /Section/ 

     public SectionController() 
     { 
      ViewData["Message"] = "THIS IS A TEST"; 
      //return View(); 
     } 

    } 
} 

Является ли это нормально решение?

ответ

0

Вы устанавливаете свой ViewData в методе действия Section вашего базового контроллера, действительно ли вы хотите установить его в конструкторе вашего базового контроллера?

public SectionController() 
{ 
    ViewData["Message"] = "THIS IS A TEST"; 
} 
+0

Это практически работает, но конструктор предназначен для создания объекта. Я не думаю, что размещение некоторых данных в ViewData имеет какое-то отношение к построению SectionController. –

+0

Я вижу, где я ошибся, я пытался вернуть ActionResult, но все, что я хотел, было сделать доступной информацию. Я редактировал свой пост с моим текущим решением. – Jemes

+0

Я не говорю, что ваше решение неверно или оно не работает, оно, безусловно, работает. Я просто говорю, что конструктор является семантически неправильным местом для заполнения viewdata. –

0

HomeController.Index не вызывает разделController.Section.

0

Поскольку ни один из запросов не сопоставляется с действием «Секция» в SectionController. Если вы сопоставили запрос типа domain/Section/Section, вы увидите свое сообщение в своем представлении (предположим, что вы используете маршрутизацию по умолчанию и имеете представление с именем «Раздел»).

Что вам нужно сделать, размещая ваше сообщение в viewdata на методе, который запускается каждый раз, когда выполняется действие. Вы можете сделать это в OnActionExecuting как:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    ViewData["Message"] = "THIS IS A TEST"; 
    base.OnActionExecuting(filterContext); 
} 

в разделеController.

Смежные вопросы