Frage

Ich habe eine Aktion wie diese:

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

Mit einer route wie dieser:

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

Die URL, die ich bin, ist:

News.mvc/Archive/2008

Ich habe ein Formular auf dieser Seite wie diese:

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

Die übermittlung der Formular sollte zu den Nachrichten.mvc/Archiv/2007 wenn '2007' gewählt in der form.

Dies erfordert die form "action" - Attribut "News.mvc/Archiv".

Allerdings, wenn erkläre ich ein Formular wie dieses:

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

es macht so:

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

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

War es hilfreich?

Lösung

Sie haben ein paar Probleme, denke ich.

Erste, Ihre route nicht über einen Standardwert für "Jahr", also die URL "/Nachrichten.mvc/Archiv" ist eigentlich nicht gültig für routing-Zwecke.

Zum zweiten bist du erwarten Formular-Werte als Parameter der route, aber das ist nicht, wie HTML funktioniert.Wenn Sie mit einem einfachen Formular mit einem select und einem reichen, Ihre URLs am Ende "?Jahr=2007" am Ende von Ihnen.Das ist nur, wie GET-Methode Formen sind entworfen, um in HTML.

Sie müssen also gekommen, um einige Schlussfolgerung über das, was wichtig ist.

  • Wenn Sie möchten, dass der Benutzer in der Lage sein, etwas auszuwählen, aus dem dropdown-und das ändert die Vorlage URL, dann sind Sie gehen zu müssen, Javascript zu verwenden, um dies zu erreichen (indem er das Formular Absenden und bei der Formulierung der korrekten URL).
  • Wenn du bist okay, mit /News.mvc - / - Archiv?year=2007 URL, dann sollten Sie entfernen die {Jahr} - Kennung, die von der Strecke völlig.Sie kann immer noch lassen Sie die "int year" - parameter auf Ihre Aktion, da die Formular-Werte werden auch Auffüllen action-Parameter der Methode.

Andere Tipps

Ich denke, dass ich verstanden habe warum - die route umfasst {Jahr}, so dass die generierten Routen immer zu..

Wer kann dies bestätigen?

Lösung

Okay, hier ist die Lösung (danke an Brad für führende mir da).

1) Benötigen Standard-Wert in der route:

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

2) Hinzufügen einer Umleitung zu analysieren, die GET-Parameter als ob Sie URL-Segmente.

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

3) Stellen Sie sicher, dass Ihre Umleitung code für Request-params bevor jeder code für Umleitung "default" - Einträge Jahr.d.h.

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

3) geben Sie Explizit den Standard-Wert für das Jahr in der Url.RouteUrl () - Aufruf:

Url.RouteUrl("News-Archive", new { year = 0 })
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top