динамическое меню site.master - PullRequest
0 голосов
/ 06 января 2009

Мне нужна помощь со следующим:

Я только что прочитал в этом уроке: http://www.asp.net/LEARN/mvc/tutorial-13-cs.aspx

и последовал примеру, приведенному для «хорошего решения». Однако я столкнулся с проблемой после внесения некоторых изменений в абстрактный класс ApplicationController.

Оригинальный конструктор:

public ApplicationController()
{                
    ViewData["categories"] = from c in DataContext.MovieCategories
                             select c;           
} 

Я изменил его, чтобы вместо него использовать хранимую процедуру:

public ApplicationController()
{                
    ViewData["categories"] =  DataContext.spMovieCategories("some movie category");
} 

Могу ли я в любом случае передать "некоторую категорию фильмов" в качестве параметра? Я пытался использовать переменные TempData и Session, но он продолжает выдавать ошибки.

Спасибо, ребята!

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Если вам нужно динамическое меню в asp.net со следующими вещами.

  • Получает визуализированный из базы данных.
  • Администратор может изменить название меню, просто обновив таблицу базы данных. Например, Office org to My Org. и т.д.
  • Вы не хотите жестко программировать URL перенаправления для любого щелчка меню. (Т.е. ввод URL также в базе данных).
  • Просто не хочу иметь xml-файл для вышеперечисленных вещей. (При создании и уничтожении переменной xml на лету, что позволяет избежать создания xml-файла на сервере).

  • Просто не хочу делать jquery

Затем нажмите здесь Динамическое меню

0 голосов
/ 28 октября 2010

Я сделал это, создав собственный класс ViewDataPage, который наследует System.Web.Mvc.ViewDataPage.

namespace myWebsite.Helpers
{
public class ViewMasterPage : System.Web.Mvc.ViewMasterPage
{
    public bcData Data = new bcData();

}
}

Измените файл web.config для включения вашего пространства имен:

  <namespaces>
    <add namespace="betClubUk.Helpers" />
  </namespaces>

Затем реализуйте данные в представлении.

<%@ Master Language="C#" Inherits="betClubUk.Helpers.ViewMasterPage" %>

<%=Data.getVariableContent().statOfDay.text %>
0 голосов
/ 06 января 2009

Вы можете использовать параметр в конструкторе, чтобы передать его:

public ApplicationController(string movieCategory)
{
    ViewData["categories"] = DataContext.spMovieCategories(movieCategory);
}

Очевидно, вам нужно будет предоставить это от производных контроллеров, что может быть проблемой, если категория не является специфичной для каждого производного контроллера, что кажется маловероятным:

public DerivedController() : base("Derived Movie Category")
{
    // ...
}

Что, вероятно, лучше всего - это удалить поиск категорий из конструктора и переместить его в отдельный метод в ApplicationController. Самый простой способ для вызова этого вызова заключается в том, чтобы вставить вызов в каждое действие, как только у вас есть параметр категории (я предполагаю, что это один из параметров для вызова действия?). Это немного больно.

Предполагаемый способ решения этой проблемы - ActionFilters, если вы создадите новый ActionFilter, подобный этому:

public class CategoryAttribute : ActionFilterAttribute, IActionFilter
{
    #region IActionFilter Members

    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        string category = (string)filterContext.RouteData.Values["category"];
        ((ApplicationController)filterContext.Controller).PopulateCategory(category);
    }

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
    }

    #endregion
}

Любое действие с примененным атрибутом Category выполнит этот код. (Я предполагал, что вы переместили код в ApplicationController в метод с именем PopulateCategory. Вы также можете применить его на уровне контроллера, что затем вызовет этот ActionFilter для каждого действия в контроллере.

Поскольку вы хотите, чтобы он вызывался для каждого действия на каждом контроллере, вы можете применить его к своему ApplicationController, чтобы каждый производный контроллер унаследовал его:

[Category]
public class ApplicationController : Controller
{
    // ...
}

[Правка - Немного лучшее решение]

Тем не менее, еще одним шагом к упрощению является не использование атрибута, а переопределение метода Controller OnActionExecuted (что я только что заметил после написания этого ответа).

Это означает, что вы можете избавиться от класса CategoryAttribute и атрибута Category в классе ApplicationController и просто добавить его в класс ApplicationController:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    string category = (string)filterContext.RouteData.Values["category"];
    this.PopulateCategory(category);
    base.OnActionExecuted(filterContext);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...