2016-03-22 14 views
0

Ich versuche herauszufinden, wo ich falsch liege.
Ich habe eine Admin Rolle in der Startup.cs konfigurieren Funktion erstellt. Ich habe eine einfache Webseite hinzugefügt, die korrekt funktioniert und die Benutzerliste anzeigt.Benutzer Admin mit MVC6

@model IEnumerable<MyProject.ViewModels.Account.UserIndexViewModel> 

@{ 
    ViewData["Title"] = "UsersList"; 
} 

<h2>Users List</h2> 

<p> 
    <a asp-action="Create">Create New</a> 
</p> 
<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.UserName) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.Email) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.UserName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Email) 
     </td> 
     <td> 
      <a asp-action="UserDetails" asp-route-id="@item.UserName">Details</a> | 
     </td> 
    </tr> 
} 
</table> 

Wenn ich versuche, um die Details des Benutzers zu erhalten, erzeugt die cshtml Seite korrekt die Adresse Account/Userdetails/NameSurname und die Userdetails Funktion im AccountController.cs aufgerufen:

[HttpGet] 
[Authorize(Roles = "admin")] 
public IActionResult UserDetails(string userName) 
{ 
    return View(); 
} 

Das Problem ist, dass userName keine Zeichenfolge ist. Ich habe versucht, das Argument als Objekt zu definieren, aber ich kann im Debuggen nicht sehen, um welche Art von Objekt es sich handelt.

Antwort

0

Ich habe eine Lösung für das Problem gefunden, vielleicht nicht die eleganteste. Anstatt den Aufruf mit dem neuen ASP-Aktion Schlüsselwort, benutzen ich die altmodischen @ Html.ActionLink:

@Html.ActionLink("Details", "UserDetails", "Account", routeValues: new { userName = item.userName }) 

Auf diese Weise wird die Userdetails Funktion in den Account korrekt aufgerufen und die Parameter korrekt auf dem geroutet Funktion.

0

Erste Sache:

Das Problem ist, dass username kein String. Ich habe versucht, das Argument als Objekt zu definieren, aber ich kann im Debuggen nicht sehen, um welche Art von Objekt es sich handelt.

Dies liegt daran, Sie userName als Aktionsparameter verwenden und wahrscheinlich verwenden Sie Standardroute mit id, so Standard id nicht userName abgebildet wird.

Sie haben 3 Optionen:

  • Änderung Aktionsparameter zu id ->public IActionResult UserDetails(string id)

  • oder neue Route hinzufügen mit userName in Startup.cs

    app.UseMvc(routes => 
    { 
        routes.MapRoute(
         name: "userdetails", 
         template: "Account/UserDetails/{userName?}", 
         defaults: new { controller="Account", action="UserDetails" }); 
    
        routes.MapRoute(
          name: "default", 
          template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
    
  • oder Link verwenden wie Account/UserDetails?userName=xxx anstelle von Account/UserDetails/NameSurname


Meiner Meinung nach 1 Option ist eine gute Praxis, weil Standard-Route in Ihrem Szenario ausreichend ist und die neuen Routen nur hinzugefügt, wenn sie notwendig sind wirklich werden sollte.


Zweite Dinge:

Sie haben Bau:
< eine asp-action = "Userdetails" asp-route-id = "@ item.Username "> Details </a>

Es Fehler meine Erklärung oben im Zusammenhang - Sie Wert ID zugewiesen haben (asp-route-id), sollte aber (asp-route-userName)

zu username zugeordnet werden <a asp-action="UserDetails" asp-route-userName="@item.UserName">Details</a>

Das Bau ist sehr clever und geben Sie die richtige Verbindung nach Ihrer Konfiguration von Routen:

  • In Ihrem Fall (Ich gehe davon aus Standardroute) geben Sie so etwas wie: Account/UserDetails?userName=JohnDoe

  • Allerdings, wenn Sie Aktionsparameter zu id aktualisieren oder Sie neue Route hinzufügen (wie obiges Beispiel), geben Sie URL wie Account/UserDetails/JohnDoe


this helps :)

Verwandte Themen