Asp.net MVC: Verschiedene Submit Actions, HTML Code im Controller

mosquito87

Lieutenant
Registriert
Aug. 2006
Beiträge
980
Hi zusammen,

für ein FH-Projekt entwickle ich zurzeit eine Webanwendung mit ASP.net MVC.
Mir geht es darum, alles möglichst sauber zu implementieren, doch die Deadline rückt auch immer näher.

Zwei Vorgehensweisen sind mir etwas aufgestoßen:
1) In der Webanwendung gibt es auf verschiedenen Seiten ein Formular mit verschiedenen Submit Buttons. Je nach Submit Button soll eine andere Methode aufgerufen werden. Ich habe viel recherchiert und nur Lösungen mit verschieden implementierten Klassen entdeckt. Momentan habe ich das Problem mit einer weiteren Methode gelöst, die prüft, welcher Button gedrückt wurde und dann eine Weiterleitung ausführt. Bei der Weiterleitung hatte ich das Problem, dass die per Post übergebenen Daten nicht so einfach auch per Post weitergeleitet werden können, sondern dass das nur mit Get möglich ist. Hab das dann über TempData[...] gelöst. Das gefällt mir aber nicht wirklich.

2) In den Controllern gebe ich Nachrichten an die View weiter, die diese anzeigen soll. Wie ist das nun mit der Formatierung, z. B. Zeilenumbrüchen? Diese im Controller direkt zu implemenieren halte ich für unsauber. Doch wie realisiere ich das am besten?

Besten Dank :-)
 
Wie viel weist Du schon über Asp.Net MVC? Hast Du Dir die Tutorials auf http://www.asp.net/mvc angesehen?

Ich habe das Gefühl, Du vermischt Dein Wissen über Standardformularverarbeitung im Web mit Asp.Net MVC.

MVC ist das Stichwort. Du definierst ein Modell, welches die Daten repräsentiert. Dort kann man über Attribute auch sagen, welche Eigenschaften Pflichtfelder sind und wie z.B. der Anzeigename lautet. Im View werden die Daten angezeigt und im Controller verarbeitet.

Im Controller gibt für jede Action eine Handlingmethode. Beim der ersten Anforderung der Seite ist das ein GET und beim Postback (z.B. durch Drücken eines Buttons) ist das ein Post.

Den View erzeugst Du mit Hilfe von HTML und Razor. Für das Aufhübschen gibt es HTML-Helper-Methoden.


Beispiel einer Anmeldemaske mit einem Formularfeld und einem Submit-Button. Achte besonders auf die fett hervorgehobenen Bezeichner.


Model

Code:
public class AccountModel
{
   public const string [B]UsernameTitle [/B]= "Geben Sie bitte Ihren Anmeldenamen ein!";

   [Required]
   [Display(Name = "Anmeldename *")]
   public string [B]UserName [/B]{ get; set; }
}


Controller

Code:
public class AccountController : AbstractBaseController
{
   public ActionResult [B]Index[/B](AccountModel model) { ... }

   [B][HttpPost][/B]
   public ActionResult [B]Index[/B](AccountModel model) 
   {  
      if (ModelState.IsValid)
      {
         var _userName = [B]model.UserName[/B];
      }
   }
}

View

Code:
@using Testproject.Models;
[B]@model AccountModel[/B]

@using (Html.BeginForm("Index", "Account", FormMethod.Post, new { id = "LoginMask" }))
{
    <div class="Login">
        <p>@Html.LabelFor(m => [B]m.UserName[/B])</p>
        <p>@Html.TextBoxFor(m => [B]m.UserName[/B], new { title = [B]AccountModel.UsernameTitle[/B] })</p>
    </div>
}
 
Zuletzt bearbeitet:
Danke für die Antwort.
Ich kann irgendwie nicht ganz nachvollziehen, auf welchen Aspekt meiner Fragen du dich allerdings beziehst.

Mein konkretes Problem ist doch, dass man in einem Formular immer nur eine Zielmethode mit oder ohne HTML-Helper (ich nutze zurzeit keine, sondern gebe direkt den HTML-Code ein) angeben kann. Ich will aber, dass je nachdem, welcher Submit-Button gedrückt wird, eine andere Zielmethode aufgerufen wird.

Das Mapping auf die Übergabeaparameter etc. ist mir schon klar.
 
Das ist das Problem mit dem Grundverständnis. Nicht böse gemeint. Das ist aber der Grund, warum ich den MVC-Ansatz in meiner Antwort noch einmal am Beispiel aufgeführt habe.

Pro Formular gibt es laut W3C nur einen einzigen Submit-Button. Wenn Du mehrere Buttons haben willst, mußt Du mehrere Formulare auf Deiner Webseite haben.

Wenn Du mehrere Aktionen innerhalb eines Formulars auslösen möchtest, dann mußt Du Links verwenden. Bedenke, daß Du einen Link so stylen kannst, daß er im Webbrowser wie ein Button aussieht, falls das notwendig sein sollte.

Asp.Net MVC kennt für diesen Zweck ActionLinks. Siehe Tutorial!

Code:
@Html.ActionLink("Edit", "Edit", new { id=item.ID })

In dem ActionLink definierst Du, welche Methode im Controller aufgerufen werden soll.

Code:
[HttpPost]
public ActionResult Edit(Movie movie) { ...}

PS: Jetzt habe ich Deinen anderen Thread mit dem Datenbankmodell wiedergefunden. Wie weit bist Du denn im Studium? Schreibst Du gerade an einer Abschlußarbeit?
 
Zuletzt bearbeitet:
Hi,

ich fasse das nicht als "böse" auf, keine Angst, sondern bin für konstruktives Feedback dankbar und weiß deine Posts zu schätzen, da sie nochmal einen Schritt weitergehen.

MVC wurde selbst ja vor dem Webentwicklungs-Boom entwickelt und musste für Webentwicklung in einigen Aspekten angepasst werden. Ich sehe es also als legitim an, dass man den Ansatz unterschiedlich interpretieren kann.

Ich sehe auch nicht, wo ich das MVC-Prinzip verletzt haben sollte. Wenn, dann habe ich höchstens gegen eine vom W3C aufgestellte Regel (1 Submit Button) verstoßen.

Ich habe aus folgendem Grund 2 Submit Buttons:
Ich habe eine Liste mit vielen Elementen. Davon kann jeweils 1 Element per Radio Button ausgewählt werden.
Über Submit Button 1 soll dann die Edit-Methode und über Submit Button 2 die Delete-Methode aufgerufen werden.
Aus Designprinzipien will ich nicht für jedes Element einen einzelnen Link (das wäre funktional gesehen gut, aber design-technisch in meinem Layout eher schlecht).
Wie sieht die Lösung dann in diesem Fall aus?
Ich verstehe den ActionLink schon, doch wie gebe ich den Value des gewählten Radio Buttons mit?

Bin übrigens nun im 5. Semester, Bachelor Wirtschaftsinformatik und die Webanwendung ist für ein Praktikum für die FH, das in den Semesterferien (also bis Sonntag) fertig sein muss.
 
Kleiner Ausflug in die Geschichte, wie ich sie erlebt habe. Der MVC-Ansatz ist sehr alt. Richtig. Asp.Net MVC ist noch recht jung und nach dem sehr suboptimalen Ansatz von Asp.Net ein neuer parallel existierender Versuch von MS ein Framework für die Webentwicklung zu schaffen. Dabei ist das Entwickerteam um Phil Hack zum Glück bei dem erzeugten HTML sehr nah an den Standards des WWW geblieben. Dafür bin ich so dankbar.

Das Asp.Net MVC Framework selbst folgt aber sehr strengen Scaffolding Mechanismen, die Du erstens verstehen und zweitens tunlichst einhalten solltest. Ist allerdings auch ganz schön viel für ein Praktikum.

Zu Deinem Problem. Ganz allgemein mußt Du dem Controller mitteilen, welcher Radiobutton in der Radiobuttongroup ausgewählt wurde. Ich will das jetzt nicht erklären. Hier ist die Antwort in Post 3: http://stackoverflow.com/questions/5660377/strongly-type-radiobuttonlist-in-mvc-3

Wenn es keine Radiobuttongroup sein muß, könntest Du auch eine DropDownList nehmen.

Model

public string SelectedSystem { get; set; }
public List<SelectListItem> SystemNames { get; set; }


View

@Html.DropDownListFor(m => m.SelectedSystem, Model.SystemNames, new { title = AccountModel.SelectedSystemTitle})


Controller

[HttpPost]
public ActionResult Index(AccountModel model)
{
var sys = model.SelectedSystem;
}


PS: Mache aus den 2 Buttons Links und style sie! Dann kannst Du auch das Framework benutzen. Würdest Du mit 2 Buttons arbeiten, müßtest Du 2 Formulare definieren. Dann kommst Du ohne Tricks aber nicht an die Radiobuttons.
 
Zuletzt bearbeitet:
Hi Ruheliebhaber,

danke für deine Bemühungen.
Eine Dropdown-Liste kommt leider nicht in Frage.

Ich würde die Submit-Buttons, wie du geraten hast, gerne durch "normale" Links ersetzen. Mein Problem ist, dass ich nicht weiß, wie ich die Links so gestalte, dass sie über POST (Get kommt nicht in Frage) den Wert des ausgewählten RadioButtons an die entsprechende Methode übergeben.

Ich habe versucht, den von dir genannten Post 3 (ich denke du meinst Antwort 3) nachzuvollziehen.
Zum Teil ist mir das denke ich auch gelungen. Aber noch nicht vollständig.

Zur View:
Wo kommt denn da opt.PaymentOptionKey? Das ist doch die Value des Radio Buttons, korrekt?

Wie wird die Methode public ActionResult PaymentSelection(PaymentSelectionVM vm) aufgerufen?

Vielen Dank.
 
Ich merke gerade, daß ich ein wenig auf dem Holzweg war. Ein Link kann nicht einfach ein Formular absenden. Das geht nur mit JavaScript. Klick!

Bei meinem Projekt war das nicht relevant, da ich einen Ajax-Ansatz verfolgt habe.

Ganz allgemein. Der Submit-Button schickt ein Formular zum Server. Ein Link bzw. ein Action-Link dient der Navigation zwischen HTML-Seiten. Der HTML-Code der Seite wird bei jedem Post vom Server neu erstellt. Weiterhin kann man mit ActionLinks bestimmte Methoden in einem Controller aufrufen und Parameter an die Methoden übergeben (Stichwort "REST"). Die Frage ist dann aber, wie man den ausgewählten Radiobutton ermittelt?

Vielleicht wäre die einfachste Lösung, ein JavaScript zu bauen, welches immer dann ausgeführt wird, wenn Du auf einen RadioButton drückst. Das Script paßt dann die Hyperreferenzen der Links an.

Code:
Beispiel GUI

( )
(x)
( )

[Edit] [Delete]


Wenn z.B. der RadioButton 2 angeklickt wird, wird der Link "Edit" durch das noch zu entwickelnde JavaScript angepaßt.

Allgemein: <a href="http://Server/Seite/Methode/Id>Edit</a>

Beispiel Index = 2: <a href="http://Server/Seite/Edit/2>Edit</a>

Im Controller muß es dann eine Methode "Edit" geben.

Code:
public ActionResult Delete(string id)
{
   // RadioButton mit der ID "id" ausgewaehlt
}

public ActionResult Edit(string id)
{
   // RadioButton mit der ID "id" ausgewaehlt
}


Mal so ganz nebenbei. Kann Dir im Praktikum niemand helfen? Selbst wenn er nicht in Asp.Net MVC 3.0 fit ist, versteht er vielleicht doch etwas von Webentwicklung und / oder Programmierung allgemein und kann Dir im gemeinsamen Gespräch helfen zu denken.

Für mich ist es sehr schwer, Dir bei speziellen Problemen zu helfen, wenn ich nicht im Projekt stecke. Weiterhin würde ich dringend empfehlen, Dir noch mal die oben verlinkten Tutorials anzuschauen. Grundlagenwissen kann man in so einem Thread nur bedingt vermitteln.
 
Zurück
Oben