Laden...

MVC Form an bestimmte Action übermitteln

Letzter Beitrag vor 15 Jahren 8 Posts 1.411 Views
MVC Form an bestimmte Action übermitteln

Hallo ich hab folgendes Formular in einer View:


  <% using (Html.BeginForm("SetFilter")) %>
    <% {%>
    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="period">
                Zeitraum:</label>
            <%= Html.DropDownList("period")%><br />
        </p>
        <p>
            <label for="firm">
                Firma:</label>
            <%= Html.DropDownList("firm")%><br />
        </p>
        <p>
            <label for="esType">
                EATyp:</label>
            <%= Html.DropDownList("esType")%><br />
        </p>
        <p>
            <label for="funds">
                Fonds::</label>
            <%= Html.DropDownList("funds")%><br />
        </p>
        <p>
            <input type="submit" value="Filter" />
        </p>
    </fieldset>
    <% } %>

und zwei ControllerActions:



// Html.BeginForm() geht hier hin im Debugmodus
[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Index(EasyFilterSelection filter)
        {
            return View();
        }
// Html.BeginForm("SetFilter") soll hier hingehen, tut es aber nicht
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult SetFilter(EasyFilterSelection filter)
        {
            return View();
        }

wobei Html.BeginForm("SetFilter") sagt, dass das Ziel die Aktion SetFilter im aktuellen Controller ist. Leider funktioniert das nicht, wobei ich nicht verstehen weshalb es nicht geht. Als ich einfach Html.BeginForm() schrieb und eine Index Aktion geschrieben hab die ebenfalls diesen Parameter annimmt ging es allerdings.

Kann mich jemand über die Verwendung von Html.BeginForm("yxx") aufklären?

Problem gelöst... der Controller bei BeginForm(<"Action">,<"Controller">) muss scheinbar explizit angegeben werden. könnte ein Bug sein, zumindest gehts bei mir nicht anders.

Html.BeginForm("SetFilter", "MeinController")

Hallo itstata

Das Verhalten von ASP.NET MVC ist korrekt so.
Wenn du nur einen String angibst, gibt du den Route Namen an.
Dabei nimmst ASP.NET MVC automatisch die Standardwerte für die Route, die meistens auf die Index Action lauten.

Schau dir am besten mal alle Überladungen im Reflector oder in der MSDN an, dann sollte das klar werden.

=> System.Web.Mvc.Html.FormExtensions

oder

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

danke, ich werd mir das mal anschauen. hab bisher nur die standardroute verwendet.
ich hab nochmal das ganze überprüft, der fehler beim mir lag an einem <form>-tag der noch um mein form geschachtelt war. das hatte ich übersehen. daher kam wohl das nicht nachvollziehbare verhalten.

Gruß

ich hab mal noch eine andere frage zu einem controller insgesamt.
in meinem formular wird ein filter gesetzt. ist es aufgabe des controllers diesen filter zurückzuhalten?

ich hätte gedacht, dass ich den vielleicht in einer variable im controller selber speichern kann. das würde aber meiner meinung nach dem mvc-prinzip wiedersprechen...


 private  static EasyFilterSelection _filterSelection;

        public ActionResult Index()
        {
            _filterSelection=null;
            return View();
        }

        public ActionResult SetFilter(EasyFilterSelection filterSelection)
        {
            _filterSelection = filterSelection;
            return View("Index");
        }


        public ActionResult ZeigFilter()
        {
            ViewData["FilterSelection"] = _filterSelection.Firm;
            return View("Index");
        }

Hallo itstata

Wieso verwendest du statische Members?
Der Zugriff darauf ist nicht threadsicher und eine Webanwendung ist zwangsmässig eine Multiuser-Anwendung.

Verwende dazu besser eine Sessionvariable, in der du den aktuellen Filter oder die ID zum Filter an einem anderen Ort zwischenspeicherst.
Solange der Filter benutzeranhängig ist, ist das der richtige Ort dafür.

Der Controller ist dafür da, die Daten vom Benutzer entgegenzunehmen, aber er sollte keinen Status halten. Auch deshalb solltest du keine statischen Members innerhalb der Controllerklasse benutzen.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

alles klar,
mach ich so. hatte nur gedacht, dass die session vielleicht etwas zu übertrieben dafür ist.

Hallo itstata

Nein, eine statische Variable ist jedoch an dieser (sowie fast jeder) Stelle ungeeignet.

Schau auch mal hier (gilt auch für ASP.NET MVC):

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011