可以部分拥有来自不同来源的两个模型吗?

时间:2017-01-17 05:45:33

标签: asp.net-mvc entity-framework

我为学生教师类型的登录用户设置了部分内容。 两者共享相同的数据库表。

在我的索引模型中,我有一个用户变量,用于表示当前登录的用户数据:

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 个答案:

答案 0 :(得分:0)

您的ViewModel应包含呈现视图所需的所有内容,包括部分内容。在您的情况下,它需要CurrentUserclasses。我假设为了下面的例子,它们是AspNetUserList<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);
}

您的观点将使用此模型,并且CurrentUserClasses可用,如下所示

@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.