视图中多个模型的简洁方法

时间:2015-06-30 11:49:06

标签: asp.net-mvc entity-framework razor

在多个模型的视图信息中渲染的最简单方法是什么。我在某些情况下使用ViewModel(特别是当模型不直接相关时),但现在我想为当前用户创建一种仪表板。因此,除了AspNetUsers模型之外,我还有几个模型(例如Orders,OperationJournal,Jobs等),就实体而言,每个模型都有一个UserID上的外键。 我做了一个ViewModel:

namespace JobShop.Models
{
    class QuickProfileVM
    {
        public IEnumerable<Jobs> Jobs { get; set; }
        public IEnumerable<AspNetUsers> AspNetUsers { get; set; }
        public IEnumerable<CreditJournal> CreditJournal { get; set; }
        public IEnumerable<CandidateReview> CandidateReview { get; set; }
    }
}

(因为我需要的基本模型是由EF完成的,它们都是关于实体之间的关系)但在我看来这还不够。我无法查看当前用户配置文件(所以一条记录)及其详细信息(多个记录和多个模型)。 我尝试使用部分视图,既有自己的控制器,也有Dashboard View控制器中的操作。 作为一个例子,我现在玩的是ActionResult:

    public ActionResult QuickProfile()
    {
        var QuickProfile = new QuickProfileVM();
        var AspNetUsers = new AspNetUsers();

        if (User.Identity.IsAuthenticated)
        {
            var CurrentUser = User.Identity.GetUserId();//UserManager.FindById(User.Identity.GetUserId());

            var TheUser = db.AspNetUsers.Where(u => u.Id == CurrentUser)
                             .Select(u => new
                             {
                                 ID = u.Id,
                                 Email = u.Email,
                                 PhoneNumber = u.PhoneNumber,
                                 Companyname = u.Companyname,
                                 Address = u.Address,
                                 ZIP = u.ZIP,
                                 City = u.City,
                                 Country = u.Country,
                                 Website = u.Website,
                                 Facebook = u.Facebook,
                                 Twitter = u.Twitter,
                                 GooglePlus = u.GooglePlus,
                                 Dribble = u.Dribble,
                                 BirthDate = u.BirthDate,
                                 Username = u.UserName,
                                 Surrname = u.Surname,
                                 Name = u.Name,
                                 Role = u.Role,
                                 ThumbURL = u.ThumbURL,
                                 CreditBalance = u.CreditBalance

                             }).Single();


            var TheJournal = db.CreditJournal.Where(tj => tj.UseBy == CurrentUser)
                                         .Select(tj => new
                                         {
                                             IdJournal = tj.IdJournal,
                                             Operation = tj.Operation,
                                             CvID = tj.CvID,
                                             JobID = tj.JobID,
                                             CreditConsumed = tj.CreditConsumed,
                                             UseDate = tj.UseDate,
                                             UseBy = tj.UseBy
                                         }).ToList();
            //similar for Jobs and CandidateReview
            //

            var UserId = TheUser.ID;
            var username = TheUser.Username;
            var role = TheUser.Role;
            var InitialCredit = TheUser.CreditBalance;

            AspNetUsers.UserName = TheUser.Username;
            AspNetUsers.Companyname = TheUser.Companyname;
            AspNetUsers.Surname = TheUser.Surrname;
            AspNetUsers.Name = TheUser.Name;
            AspNetUsers.ThumbURL = TheUser.ThumbURL;
            AspNetUsers.CreditBalance = InitialCredit;

            //I put this to ilustrates what I have accesible for example
            //about CreditJournal: only methods, not properties
            QuickProfile.CreditJournal.AsEnumerable();

        var id = CurrentUser;
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        AspNetUsers aspNetUsers = db.AspNetUsers.Find(id);
        if (aspNetUsers == null)
        {
            return HttpNotFound();
        }

        }

        return View(AspNetUsers);
        //Disbled since at this stage is not usefull
        //return View(QuickProfile);
        //return View();
    }

1 个答案:

答案 0 :(得分:1)

我建议您考虑在视图中使用Html.RenderAction。例如,假设您的主仪表板是:

@{
    ViewBag.Title = "title";
}

<h2>Multiple Models</h2>

@{ Html.RenderAction("GetData", "Foo"); }

您可以使用Html.RenderAction来致电FooController.GetData()

public class FooController : Controller
{
    public ActionResult GetData()
    {
        var viewModel = new FooViewModel();
        viewModel.TimeStamp = DateTime.UtcNow;

        return View(viewModel);
    }
}

因此,您可以拆分仪表板视图的渲染,而不是将一个视图模型与许多其他视图模型作为属性附加。

总的来说,这应该会让事情变得更容易 - 我过去曾使用过这种方法,并发现它降低了复杂性。