2016-05-08 8 views
1

Ich listet einige Daten aus meiner SQL Server-Datenbank in einer Tabelle mit MVC auf. Was ich brauche, ist nur die Daten anzeigen zu können, bei denen die Benutzer-ID gleich dem tatsächlich authentifizierten Benutzer ist.MVC LINQ, wobei Benutzer-ID dem authentifizierten Benutzer entspricht

Das ist, was ich in dieser Zeit gemacht haben:

public class ManageViewModel 
    { 
    public string FileName { get; set; } 

    public string ContentType { get; set; } 

    public string Format { get; set; } 
    } 

Meine Ansicht:

@model IEnumerable<Transcode.Models.ManageViewModel> 
 
@{ 
 
    ViewBag.Title = "Index"; 
 
} 
 
<h2>Index</h2> 
 
<table style="width:100%"> 
 
    <tr> 
 
     <th>File Name</th> 
 
     <th>Actual Format</th> 
 
     <th>Requested Format</th> 
 
    </tr> 
 
    @foreach (var item in Model) 
 
    { 
 
     <tr> 
 
      <td>@item.FileName</td> 
 
      <td>@item.ContentType</td> 
 
      <td>@item.Format</td> 
 
     </tr> 
 
    } 
 
</table>

mein Controller und LINQ-Abfrage:

public class ManageController : Controller 
{ 
    ApplicationDbContext db = new ApplicationDbContext(); 
    public ActionResult Index() 
    { 
     var Model = from file in db.Conversions 
        join codec in db.Codecs on file.CodecID equals codec.CodecID 
        where file.UserID.Equals(User.Identity.IsAuthenticated) 
        select new ManageViewModel 
        {        
         FileName = file.FileName, 
         ContentType = file.ContentType, 
         Format = codec.Format 
        }; 
     return View(Model); 

    } 
} 

Ich erhalte die folgenden Fehler in meinem @foreach (var Artikel in Model):

Eine Ausnahme vom Typ 'System.NotSupportedException' in EntityFramework.SqlServer.dll aufgetreten, wurde aber nicht in Benutzercode Zusätzliche Informationen behandelt: Es konnte kein konstanter Wert vom Typ 'System.Object' erstellt werden. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt.

Antwort

4

Hier Sie vergleichen Äpfel (Integer) mit Orangen (boolean):

where file.UserID.Equals(User.Identity.IsAuthenticated) 

Sollten Sie nicht auf Äpfel (Integer) zu vergleichen Äpfel (Integer) werden statt? So könnte man zunächst die ID der aktuell authentifizierten Benutzer immer mit der GetUserId() Erweiterungsmethode:

string userId = this.User.Identity.GetUserId(); 

dann wandeln sie in einer ganzen Zahl oder was auch immer die zugrunde liegenden Typen Ihrer Bezeichner sind:

int id = int.Parse(userId); 

und

where file.UserID == id 

Und last but not least, da Sie mit den Nutzern zu tun haben, Ihr: dann können Sie in Ihren LINQ-Klausel vergleichenAktion sollte mit dem [Authorize]-Attribut dekoriert werden, um sicherzustellen, dass nur authentifizierte Benutzer es aufrufen können:

+0

Vielen Dank! Funktioniert perfekt! Eigentlich ist meine UserID ein String und kein Int, also muss ich die UserID nicht analysieren. – Huby03

+0

Cool, dann ist es noch einfacher. –

Verwandte Themen