2009-06-29 2 views
1

ich im Grunde die Standard-ASP.NET MVC-Vorlage nehme und es erstreckt:asp.net MVC kann ich ein Menü haben, die sowohl von ID und Benutzernamen verknüpft

am site.master Sehen, sehe ich für die Menüs:

<ul id="menu">    
    <li><%= Html.ActionLink("Home", "Index", "Home")%></li> 
    <li><%= Html.ActionLink("About", "About", "Home")%></li> 
</ul> 

ich bearbeite sie dann durch die folgenden:

<ul id="menu">    
    <li><%= Html.ActionLink("Home", "Index", "Home")%></li> 
    <li><%= Html.ActionLink("About", "About", "Home")%></li> 
    <li><%= Html.ActionLink("My Contact Info", "Details/" + Html.Encode(Page.User.Identity.Name), "Users")%></li> 
</ul> 

das Problem ist, dass in der Steuerung, ich zwei verschiedene Methoden:

// 
// GET: /Users/Details/userName 
public ActionResult Details(string loginName) 
{ 
    UserInfo user = repo.GetUserByName(loginName); 
    return View(user); 
} 

// 
// GET: /Users/Details/5 
public ActionResult Details(int id) 
{ 
    UserInfo user = repo.GetUser(id); 
    return View(user); 
} 

Ich bekomme eine Ausnahme, die sagt, mehrdeutige Methode. Weil es nicht herausfinden kann, wen man anruft. Ich würde hoffen, dass es beim Dateityp herausfinden könnte, aber anscheinend nicht.

Hat jemand irgendwelche Vorschläge für die Unterstützung von Details anzeigen und Abfragen von verschiedenen Feldern? (Natürlich alle der abfragbaren Felder sind einzigartig.)

+0

ich gerade dachte, dass Sie auch sicherstellen möchten, würden einige Validierung auf dem neuen Benutzer laufen Namen, damit sie keinen Benutzernamen erstellen können, der wie eine Nummer aussieht! – Funka

Antwort

2

Wenn Sie eine Route hatte wie:

routes.MapRoute(
      "Users",            // Route name 
      "Users/Details/{username}",       // URL with parameters 
      new { controller = "Users", action = "Details", username = "" } // Parameter defaults 
     ); 

die verwendet werden könnten Zweideutigkeit mit der Standardroute zu vermeiden .. Sie müssten dies setzen, bevor der Standard "{Controller}/{Aktion}/{id}" -Route, so dass es Priorität ...

dann erhalten würden, könnten Sie eine Aktion wie haben:

// GET: /Users/Details/username or //GET: /Users/Details?id=theId 
public ActionResult Details(string username, int? id) 
{ 
    if(id!=null) 
    { 
     UserInfo user = repo.GetUser(id.Value); 
     return View(user); 
    } 
    if(!String.IsNullOrEmpty(username)) 
    { 
     UserInfo user = repo.GetUserByName(username); 
     return View(user); 
    } 
...//Handle bad url.. redirect to error...you decide ;) 
} 

Sie könnten dann diese zugreifen Aktion wie e dies:
/Users/Details/Benutzernamen oder ..
/Users/Info id = userId

+0

können Sie hier erklären oder geben Sie ein Beispiel mit dem obigen Code. Ich verstehe nicht ganz – leora

+0

Die Antwort ein bisschen geändert - das ist eine Möglichkeit zu tun, was ich denke, Sie suchen ... – markt

Verwandte Themen