2016-04-01 4 views
0

Ich arbeite mit ASPNET MVC5 und ich gerade folgte diesem Tutorial: http://www.c-sharpcorner.com/UploadFile/4d9083/creating-simple-grid-in-mvc-using-grid-mvc/ und es funktioniert gut. Ich möchte jetzt meine Homecontroller mit 2 Tabellen (Benutzer & Rollen) aktualisieren, Hinweis: My Datacontext enthält zwei Tabellen (Benutzer & Rollen)MVC5 MVCGRID Linq multiple Tabellen

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); 
     } 

kehre ich gut meine Ergebnisse

Jetzt in meiner Ansicht:

Mein Details.cs html Ist das Problem hier? kann ich shanuMVCUserRoles.DB.AspNetUser anrufen & 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> 

ich habe folgende Fehlermeldung: Das Modellelement in das Wörterbuch übergeben ist vom Typ 'System.Data.Linq.DataQuery 1[<>f__AnonymousType4 2 [shanuMVCUserRoles.DB.AspNetUser, shanuMVCUserRoles.DB.AspNetUserRole]]' , aber dieses Wörterbuch benötigt ein Modellelement vom Typ 'System.Collections.Generic.IEnumerable' 1 [shanuMVCUserRoles.DB.AspNetUser] '.

Antwort

0

können Sie das Problem umgehen, indem Sie Ihre AspNetUserRoles-Auflistung in ViewBag einfügen. Dieser Link zeigt diese Lösung unter anderem: http://www.codeproject.com/Articles/687061/Multiple-Models-in-a-View-in-ASP-NET-MVC-MVC

Persönlich halte ich das Modell als eine Art Vertrag zwischen meinem Controller und meiner Ansicht, so dass ich weiß nicht, wie Geschäftsinformationen außerhalb des Modells setzen. Zum Beispiel wäre es in Ordnung, eine Zeichenfolge zu speichern, um DateTimes in den ViewBag zu formatieren. Aber wenn ich möchte, dass ein Controller und eine View Benutzer und Rollen verwalten, möchte ich, dass es für mich und für alle anderen klar ist, die den Code lesen, was heute, morgen oder in zehn Jahren passieren kann.

in diesem Fall also würde ich eine Modellklasse erstellen:

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

ich es und es in meinem Controller-bevölkern schaffen würde. Dann in meiner Ansicht würde ich erklären:

@model WebApplication1.Models.UsersAndRolesModel 

und schließlich meine Gitter:

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

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

Ich hoffe, das hilft.

Schnitt: Hallo David, es hängt davon ab, was Sie wollen tatsächlich tun: Haben Sie eine Ansicht, die zwei Tabellen möchten, eine für alle Benutzer und eine für alle Rollen? In diesem Fall wird eine erste Implementierung könnte (aber sollte nicht) sein:

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

Ich schrieb sollte nicht sein, weil DataClassesUserDataContext nach Gebrauch entsorgt werden müssen.Also was Sie wirklich tun sollten, ist:

0

Ich habe meine vorherige Antwort mit einigen Informationen darüber, wie der Controller implementiert werden könnte bearbeitet. Die Nullreferenceexception geschieht, weil

Rückkehr
return View(); 

auf die Ansicht ein Null-Modell bietet, so Model.Users und Model.Roles die Nullreferenceexception in Ihrer Ansicht führen. Bitte beachten Sie, dass ich

return View(model); 

in meinem Homecontroller kehre zurück.

Lassen Sie mich nur hinzufügen, dass ich vermeiden, DbContexts in meinen Controllern zu verwenden. Ich bevorzuge die Implementierung des Repository-Musters. Hier finden Sie ein schönes Beispiel: 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 Es ist ein besserer Ansatz, da Sie ein Testprojekt erstellen und Ihre Controller testen können, indem Sie Mock Repository-Implementierungen bereitstellen.

+0

Ja, Ok Danke! – david