Шаблон дизайна макета MVC Layout - PullRequest
1 голос
/ 06 апреля 2011

Каждая страница на моем сайте должна иметь одни и те же данные, аналогично тому, как в SO каждая страница отображает информацию о текущем пользователе в верхней части страницы. Способ, которым я реализовал это, должен был иметь базовый класс контроллеров, из которого все мои контроллеры происходят. В конструкторе этого базового контроллера я поместил свою модель в ViewBag, а затем моя страница макета использует это.

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

@{var layoutHtml = new HtmlHelper<LayoutModel>(Html.ViewContext, Html.ViewDataContainer); }
@* OK, now we can use the html helper... *@
@layoutHtml.TextAreaFor(model => model.Feedback)

Я действительно не хочу иметь свой подкласс моделей из модели макета, поскольку это заставит каждое действие заполнять данные совместно используемой модели по отдельности, но создание HtmlHelpers вручную также кажется плохой идеей.

Есть мысли?

Ответы [ 4 ]

3 голосов
/ 06 апреля 2011

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

2 голосов
/ 06 апреля 2011

Базовый контроллер - отличный способ начать. Я бы также представил базовую модель. Базовая модель представления будет содержать специфичную для пользователя информацию.

public abstract class BaseController : Controller
{
    public string CurrentAccountName
    {
        get
        {
            return (HttpContext.User == null) ? null : HttpContext.User.Identity.Name;
        }
    }

    public T CreateViewModel<T>() where T : BaseViewModel, new()
    {
        T viewModel = new T
        {
            UserName = CurrentAccountName
        };

        return viewModel;
    }
}

public abstract class BaseViewModel
{        
    public string UserName { get; set; }
}

Затем при каждом запросе вы будете заполнять свою модель представления специфичной для пользователя информацией и любой информацией, необходимой для представления. MyViewModel - это просто модель представления, которая наследуется от BaseViewModel.

public class MyController : BaseController
{
    public ActionResult Index()
    {
        MyViewModel viewModel = CreateViewModel<MyViewModel>();

        return View(viewModel);
    }
}

В главном представлении я передаю BaseViewModel, а представление - в унаследованном MyViewModel.

Теперь у вас есть доступ к вашей пользовательской информации в вашем главном представлении, и вы можете передать ее частичному или отобразить непосредственно на странице.

0 голосов
/ 06 апреля 2011

Я считаю, что вы можете использовать RenderAction для решения этой проблемы. Поскольку информация, отображаемая в этом действии, является общей для всех страниц, вы можете поместить ее в BaseController и вызывать ее у мастера сайта. он вычислит свою собственную модель и вернет эту модель в частичное представление, которое может быть строго типизировано, и вам не нужно создавать экземпляр htmlHelper, как вы делаете сейчас.

0 голосов
/ 06 апреля 2011

вы можете определить несколько макетов, которые вы можете использовать в подходящих видах! Просто включите их так:

@{
    Layout = "~/Views/Shared/_MySubLayout.cshtml";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...