2016-04-01 1 views
0

Im работает с ASPNET MVC5, и я просто следую этому руководству: http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-grid-in-mvc-using-grid-mvc/, и он отлично работает. теперь я хочу, чтобы обновить HomeController с 2 таблицы (Пользователи & роли), Примечание: Моя DataContext содержит 2 таблицы (пользователей & ролей)MVC5 MVCGRID Linq кратные таблицы

HomeController.cs

public ActionResult Details() 
     { 
      DataClassesUserDataContext db = new DataClassesUserDataContext(); 
      var SchemeList = from d in db.AspNetUsers 
          join i in db.AspNetUserRoles 
           on d.Id equals i.UserId 
          select new { AspNetUsers = d, AspNetUserRole = i }; 
      return View(SchemeList); 
     } 

Я возвращаю хорошо My результаты

Сейчас, на мой взгляд:

мой Details.cs html Проблема здесь? могу я вызвать shanuMVCUserRoles.DB.AspNetUser & AspNetUserRoles ???

@model IEnumerable <shanuMVCUserRoles.DB.AspNetUser> 
// possible to add other models here ? @model IEnumerable <shanuMVCUserRoles.DB.AspNetUserRole > 


    > <div 
    > class="code-cut"> 
    >  @Html.Grid(Model).Columns(columns => { 
    >  columns.Add(c => c.UserName).Titled("UserName").Filterable(true); 
    >  columns.Add(c => c.Id).Titled("ID").Filterable(true); 
    >  columns.Add(c => c.PasswordHash).Titled("PasswordHash").Filterable(true); 
    >  columns.Add(c => c.Email).Titled("Email").Filterable(true); 
    >  columns.Add(c => c.AccessFailedCount).Titled("AccessFailedCount").Filterable(true); 
    >  columns.Add(c => c.PhoneNumber).Titled("PhoneNumber").Filterable(true); 
    >  columns.Add() 
    >  .Encoded(false) 
    >  .Sanitized(false) 
    >  .SetWidth(30) 
    >  .RenderValueAs(o => Html.ActionLink("Edit", "Edit", new { id = o.Id })); }).WithPaging(10).Sortable(true) </div> 

У меня есть следующее сообщение об ошибке: модели элемент передается в словарь типа 'System.Data.Linq.DataQuery 1[<>f__AnonymousType4 2 [shanuMVCUserRoles.DB.AspNetUser, shanuMVCUserRoles.DB.AspNetUserRole]]' , но для этого словаря требуется элемент модели типа «System.Collections.Generic.IEnumerable`1 [shanuMVCUserRoles.DB.AspNetUser]».

ответ

0

вы можете решить эту проблему, поставив свою коллекцию AspNetUserRoles в ViewBag. Эта ссылка показывает, что это решение среди других: http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC

Лично я считаю модель как своего рода контракта между моим контроллером и с моей точки зрения, так что я не люблю положить деловой информации за пределами модели. Например, было бы нормально хранить строку для форматирования DateTimes в ViewBag. Но если я хочу, чтобы Controller и View управляли пользователями и ролями, я хочу, чтобы это было ясно для меня и для кого-либо еще, читающего код, который может произойти сегодня, завтра или через десять лет.

Так что в этом случае я хотел бы создать класс Model:

namespace WebApplication1.Models 
{ 
    public class UsersAndRolesModel 
    { 
     public IList<shanuMVCUserRoles.DB.AspNetUser> Users { get; set; } 
     public IList<shanuMVCUserRoles.DB.AspNetRole> Roles { get; set; } 
    } 
} 

Я хотел бы создать его и заполнить его в своем контроллере. Тогда на мой взгляд, я бы объявить:

@model WebApplication1.Models.UsersAndRolesModel 

и, наконец, мои сетки:

@Html.Grid(Model.Users).Columns(columns => { // and so on... 

@Html.Grid(Model.Roles).Columns(columns => { // and so on... 

Я надеюсь, что это помогает.

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

public ActionResult Details() 
    { 
     UsersAndRolesModel model = new UsersAndRolesModel(); 
     DataClassesUserDataContext db = new DataClassesUserDataContext(); 
     model.Users = db.AspNetUsers.ToList(); 
     model.Roles = db.AspNetUserRoles.ToList(); 
     return View(model); 
    } 

Я написал не должно быть, потому что DataClassesUserDataContext должны быть утилизированы после использования.Так что вы действительно должны сделать это:

public class HomeController : Controller 
{ 
    private DataClassesUserDataContext db = new DataClassesUserDataContext(); 

    public ActionResult Details() 
    { 
     UsersAndRolesModel model = new UsersAndRolesModel(); 
     model.Users = db.AspNetUsers.ToList(); 
     model.Roles = db.AspNetUserRoles.ToList(); 
     return View(model); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

} 
0

Я отредактировал свой предыдущий ответ с некоторой информацией о том, как можно реализовать контроллер. NullReferenceException происходит потому, что возвращение

return View(); 

обеспечивает нулевой модели на вид, так и Model.Users Model.Roles вызывают NullReferenceException на ваш взгляд. Пожалуйста, обратите внимание, что я возвращаюсь

return View(model); 

в моем HomeController.

Просто позвольте мне добавить, что я не использую DbContexts в своих контроллерах. Я предпочитаю использовать шаблон репозитория. Здесь вы можете найти хороший пример: http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application Это лучший подход, поскольку он позволяет вам создать тестовый проект и протестировать ваши контроллеры, предоставив реалистичные реализации репозитория.

+0

Да, хорошо Спасибо! – david

Смежные вопросы