ASP.NET MVC Доступ к данным модели на главной странице - PullRequest
0 голосов
/ 12 мая 2010

Я создал UserSiteBaseController, который получает часто используемые данные и устанавливает данные для модели представления UserSiteBaseViewData в методе с именем SetViewData

public T CreateViewData<T>() where T : UserSiteBaseViewData, new()
{
    ....
}

Затем я создаю определенные контроллеры, которые наследуются от UserSiteBaseController, а также viewModels, которые наследуются от UserSiteHomeViewData и могут быть созданы в контроллере следующим образом:

   public ActionResult Index(string slug)
        {
            Slug = slug;
            var viewData = CreateUserSiteHomeViewData<UserSiteHomeViewData>();
            //If invalid slug - throw 404 not found
            if (viewData == null)
                return PageNotFound();
            viewData.Announcements = _announcementsData.All(slug).ToList();
            return View(viewData);
        }

        private T CreateUserSiteHomeViewData<T>() where T : UserSiteHomeViewData, new()
        {
            T viewData = CreateViewData<T>();
            return viewData;
        }

UserBaseViewData содержит данные, которые необходимо использовать на каждой странице, поэтому было бы здорово иметь возможность доступа к этим данным с мастер-страницы строго типизированным способом. Возможно ли это или я поступаю неправильно?

1 Ответ

2 голосов
/ 13 мая 2010

Если ваша мастер-страница унаследована от System.Web.Mvc.ViewMasterPage<BaseViewModel>, вы должны идти ...?

НО, когда я впервые начал использовать MVC, я пошел по тому же маршруту, используя класс BaseViewModel, который содержал все мои общие элементы ViewModel, а затем я создал конкретные модели представлений, например, EventListingViewModel, который унаследован от этого BaseViewModel - очень похоже на то, что вы делаете. Мои мастер-страницы унаследовали от System.Web.Mvc.ViewMasterPage<BaseViewModel>, и все шло отлично.

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

Итак, я вернулся к использованию стандартного словаря ViewData (со статическим классом VewDataKeys, чтобы избежать магических строк) для всех моих общих свойств, а затем к использованию пользовательских объектов POCO, которые не наследуются от чего-либо, в качестве моих моделей представления. Это работает намного лучше, и я бы не стал переодеваться.

HTHS
Charles

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...