Должны ли я иметь разные модели и представления для каких-либо пользовательских данных, чем для некоторых пользовательских данных? - PullRequest
1 голос
/ 27 апреля 2010

Я только начинаю изучать asp.net mvc и не уверен, что правильно делать.

У меня есть пользователь, и у пользователя есть коллекция (0 или более) напоминаний. У меня есть контроллер для пользователя, который получает напоминания для текущего пользователя, вошедшего в систему, из службы напоминаний. Он заполняет модель, которая содержит некоторую информацию о пользователе и коллекции напоминаний.

У меня вопрос: нужно ли мне иметь 2 разных представления: одно, когда нет напоминаний, и другое, когда есть напоминания? Или я должен иметь 1 просмотр, который проверяет количество напоминаний и отображает разные вещи? Одно представление кажется неправильным, так как в итоге я получаю код, который говорит if (Model.Reminders.Count==0){//do something} else {do something else}, а логика в представлении кажется неправильным. Но если я хочу иметь 2 разных представления, я хотел бы иметь такой код в моем контроллере:

[Authorize]
public ActionResult Index()
{
    MembershipUser currentUser = m_membershipService.GetUser();
    IList<Reminder> reminders = m_reminderRepository.GetReminders(currentUser);
    if (reminders.Count == 0)
    {
        var model = new EmptyReminderModel
        {
            Email = currentUser.Email,
            UserName = currentUser.UserName
        };
        return View(model);
    }
    else
    {
        var model = new ReminderModel
                       {
                           Email = currentUser.Email,
                           UserName = currentUser.UserName,
                           Reminders = reminders
                        };
        return View(model);
    }

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

[Authorize]
public ActionResult Index()
{
    MembershipUser currentUser = m_membershipService.GetUser();
    IList<Reminder> reminders = m_reminderRepository.GetReminders(currentUser);
    if (reminders.Count == 0)
    {
        return RedirectToAction("ShowEmptyReminders");
    }
    else
    {
        return RedirectToAction("ShowReminders");
    }            
}

, что выглядит лучше, но тогда мне нужно повторно запросить напоминания для текущего пользователя в действии ShowReminders.

Или я должен заниматься чем-то другим полностью?

1 Ответ

2 голосов
/ 27 апреля 2010

Для такой незначительной сложности я не нахожу проблемы с наличием в представлении блока «<% if .. else%>».Однако, если вы чувствуете, что действительно хотите пройти расстояние ...

Один из возможных ответов - использовать DisplayTemplates.Если у вас есть одна базовая UserBaseViewModel, а затем ваши UserWithRemindersViewModel и UserWithoutRemindersViewModel наследуются от UserBaseViewModel, то вы можете передать UserBaseViewModel в качестве универсального типа для вашего представления, aka System.Web.Mvc.ViewPage .

Затем, в зависимости от вашей логики в контроллере, вы передаете обратно UserWithRemindersViewModel или другое представление.(aka. return View (new UserWithoutRemindersViewModel ()); // Наследует UserBaseViewModel, так что все в порядке!)

Затем вы можете просто вызвать Html.DisplayFor (m => m) для вашего представления.

Если вы создадите два шаблона в \ Views \ \ DisplayTemplates \, UserWithRemindersViewModel.ascx и UserWithoutRemindersViewModel.ascx.MVC выберет правильный шаблон отображения для типа вашей модели, которую вы передали, и, поскольку каждый из этих PartialViews будет строго типизирован для правильного типа модели представления, нет необходимости в <% if ... else%> для отображенияправильный HTML.

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