我为学生和教师类型的登录用户设置了部分内容。 两者共享相同的数据库表。
在我的索引模型中,我有一个用户变量,用于表示当前登录的用户数据:
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的正确方法是什么?
答案 0 :(得分:0)
您的ViewModel应包含呈现视图所需的所有内容,包括部分内容。在您的情况下,它需要CurrentUser
和classes
。我假设为了下面的例子,它们是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.