2008-09-08 8 views
5

Ich habe eine Aktion wie folgt aus:ASP.NET MVC Preview 4 - Stopp Url.RouteUrl() usw. in einem der vorhandenen Parameter

public class News : System.Web.Mvc.Controller 
{ 
    public ActionResult Archive(int year) 
    { 
    /***/
    } 
} 

eine Route wie folgt aus:

routes.MapRoute(
      "News-Archive",            
      "News.mvc/Archive/{year}",       
      new { controller = "News", action = "Archive" } 
     ); 

Die URL dass ich auf ist:

News.mvc/Archive/2008 

ich ein Formular auf dieser Seite wie diese:

<form> 
    <select name="year"> 
     <option value="2007">2007</option> 
    </select> 
</form> 

Das Senden des Formulars sollte zu News.mvc/Archive/2007 gehen, wenn im Formular '2007' ausgewählt ist.

Dies erfordert, dass das Formular "action" -Attribut "News.mvc/Archive" lautet.

Allerdings, wenn ich ein Formular wie folgt erklären:

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>"> 

es macht wie:

<form method="get" action="/News.mvc/Archive/2008"> 

Kann jemand bitte lassen Sie mich wissen, was ich bin fehlt?

Antwort

2

Sie haben ein paar Probleme, denke ich.

Erstens hat Ihre Route keinen Standardwert für "Jahr", daher ist die URL "/News.mvc/Archive" eigentlich nicht für Routing-Zwecke gültig.

Zweitens erwarten Sie, dass Formularwerte als Routenparameter angezeigt werden, aber so funktioniert HTML nicht. Wenn Sie ein einfaches Formular mit einer Auswahl und einem Senden verwenden, wird Ihre URL am Ende mit "? Year = 2007" enden. So können GET-Methodenformulare in HTML arbeiten.

Sie müssen also zu einer Schlussfolgerung kommen, was wichtig ist.

  • Wenn Sie wollen, dass der Benutzer in der Lage sein, etwas aus der Dropdown-Liste auswählen und das ändert die Vorlage URL, dann ist diese Sie gehen zu müssen Javascript verwenden zu erreichen (durch das Abfangen der Form einreichen und die Formulierung der richtigen URL).
  • Wenn Sie mit /News.mvc/Archive?year=2007 als URL einverstanden sind, sollten Sie den Bezeichner {year} vollständig aus der Route entfernen. Sie können den Parameter "int year" weiterhin für Ihre Aktion verwenden, da form values ​​auch die Parameter der Aktionsmethode auffüllt.
+0

Auf dem richtigen Weg. Weitere Informationen finden Sie unter Kommentare bearbeiten. –

0

Ich glaube, ich habe gearbeitet, warum - die Route umfasst {Jahr} so die generierten Routen werden immer auch ..

Wenn jemand dies bestätigen?

0

Lösung

hier Okay, ist die Lösung, (dank Brad für mich dort führt).

1) Standardwert in der Route erforderlich:

routes.MapRoute(
     "News-Archive",            
     "News.mvc/Archive/{year}",       
     new { controller = "News", action = "Archive", year = 0 } 
    ); 

2) eine Umleitung In den Parameter zu analysieren GET, als ob sie URL Segmente sind.

public ActionResult Archive(int year) 
{ 
    if (!String.IsNullOrEmpty(Request["year"])) 
    { 
     return RedirectToAction("Archive", new { year = Request["year"] }); 
    } 
} 

3) Stellen Sie sicher, dass Sie Ihre Umleitung Code für Request params vor einen Code für "default" Jahr Einträge umleiten. das heißt

public ActionResult Archive(int year) 
{ 
    if (!String.IsNullOrEmpty(Request["year"])) 
    { 
     return RedirectToAction("Archive", new { year = Request["year"] }); 
    } 
    if (year == 0) 
    { 
     /* ... */ 
    } 
    /* ... */ 
} 

3) Explizit den Standardwert für Jahr in der Url.RouteUrl() -Aufruf angeben:

Url.RouteUrl("News-Archive", new { year = 0 })