Может ли частичный иметь две модели из разных источников?

У меня есть частичный набор для зарегистрированного пользователя типа студент и учитель .
Оба используют одну и ту же таблицу базы данных.

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

public ActionResult Index()
        {

            AspNetUser CurrentUser = null;
            if (Request.IsAuthenticated)
            {
                string userID = User.Identity.GetUserId();
                CurrentUser = this.Db.AspNetUsers.Single(g => g.Id == userID);
            }
            else
            {
                studentIndex.CurrentUser = null;
            }

            return View(CurrentUser);
        }

Затем файл представления индекса проверяет один параметр и в зависимости от него вызывает соответствующее частичное действие

if (Model.CurrentUser.ClassId != 0) //classID = 0 is reserved for teachers
    {
        Html.RenderAction("_StudentIndexView", "Home"); 
    }

Частичное действие выглядит следующим образом:

[ChildActionOnly]
public ActionResult _StudentIndexView ()
{
    return PartialView(this.Db.classes.ToList());
}

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

Как правильно получить vaules из обоих источников в одном контроллере?

1 ответ

  1. ViewModel должен содержать все необходимое для отображения представления, включая частичное. В вашем случае то ей и нужно CurrentUserclasses. Я предполагаю, что ради приведенных ниже примеров они относятся AspNetUserк типу List<Class>И. Это означает, что ваша модель должна быть чем-то вроде

    public class IndexModel
    {
        public AspNetUser CurrentUser { get; set; }
        public List<Class> Classes { get; set; }
    }
    

    вы после этого настроили бы всю модель в Indexдавать вас

    public ActionResult Index()
    {
        AspNetUser currentUser = null;
        if (Request.IsAuthenticated)
        {
            string userID = User.Identity.GetUserId();
            currentUser = this.Db.AspNetUsers.Single(g => g.Id == userID);
        }
    
        var model = new IndexModel
                        {
                            CurrentUser = currentUser,
                            Classes = this.Db.classes.ToList()
                        };
    
        return View(model);
    }
    

    Ваша точка зрения будет использовать эту модель и будет иметь оба CurrentUserи Classesдоступны следующим образом

    @model IndexModel
    
    //some stuff using Model.CurrentUser where needed
    
    if (Model.CurrentUser.ClassId != 0) //classID = 0 is reserved for teachers
    {
        Html.RenderPartial("_StudentIndexView", Model);
    }
    
    //more stuff using Model.CurrentUser where needed
    

    При отображении частичного непосредственно в представлении вы можете избавиться _StudentIndexViewот контроллера, если он не нужен для чего-то еще (например, вызов AJAX).

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

    @model IndexModel
    
    //the content of your view using Model.CurrentUser and Model.Classes where required.