Laden...

ASP.Net MVC2 Kompliziertes UserControl

Erstellt von topperdel vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.186 Views
T
topperdel Themenstarter:in
67 Beiträge seit 2007
vor 13 Jahren
ASP.Net MVC2 Kompliziertes UserControl

Hallo zusammen!

Ich brauche ein User-Control für folgenden Anwendungsfall:
ich möchte einen "Fragenblock" anzeigen. Das heißt, ich habe ein Question-Objekt, das immer 4 Answers enthält. Jede Antwort besteht aus einem Text und einem Buchstabenwert. Von den 4 Antworten kann und muss nur eine ausgewählt werden (Radiobuttons). Von der selektierten Antwort möchte ich den Buchstaben wegspeichern.
Es sieht also grob so aus:
O Antwort 1
O Antwort 2
O Antwort 3
O Antwort 4

Es gibt mehr Buchstaben als mögliche Antworten pro Frage. Es kann also sein, dass Antwort 1 den Buchstaben A, 2 B, 3 C und 4 D entspricht. Kann aber auch 1=N, 2=X, 3=A und 4=B sein.

Wie kriege ich das so mit einem Benutzersteuerelement umgesetzt, dass ich nur mein Question-Objekt reingebe und ich bei einer Post-Back-Action für den Fragenblock (es können bis zu vier davon auf einer Seite sein) den gewählten Buchstaben bekomme?
Ich steh total auf dem Schlauch und komme mit dem Benutzersteuerelement-Konzept von MVC2 nicht zurecht. Ich freue mich über jeden Hinweis!

Viele Grüße und Danke!

TopperDEL

699 Beiträge seit 2007
vor 13 Jahren

Hallo,

ich versuche mal deine fragen zu beantworten, sofern ich das richtig verstanden habe was Du umsetzen möchtest.

Es gibt mehr Buchstaben als mögliche Antworten pro Frage. Es kann also sein, dass Antwort 1 den Buchstaben A, 2 B, 3 C und 4 D entspricht. Kann aber auch 1=N, 2=X, 3=A und 4=B sein.

Erstelle dir am besten ein Object, das du dann an einen Radiobutton binden kannst.
In dem Object, kannst du dann den Text speichern der angezeigt werden soll, und auch deinen Buchstaben, den du wieder auslesen möchtest.

Bei einem Postback musst du dann nur ermitteln, welcher der RadioButton markiert ist, und kannst leicht darüber dann wieder alles auslesen.

Wie kriege ich das so mit einem Benutzersteuerelement umgesetzt, dass ich nur mein Question-Objekt reingebe und ich bei einer Post-Back-Action für den Fragenblock (es können bis zu vier davon auf einer Seite sein) den gewählten Buchstaben bekomme?

Prinzipiell spielt es keine rolle, wieviele der UserControls auf einer Page sind. Jedes UserControl verarbeitet seinen bereich für sich ( PostBack ).
Du musst nur in der Page darüber die UserControls wieder auslesen. Auch die Page verarbeitet dabei einen PostBack selbst.

Hoffe das hilft ein bisschen weiter.

Grüße Stephan

T
topperdel Themenstarter:in
67 Beiträge seit 2007
vor 13 Jahren

Hallo Stipo!

Danke für deine Antwort.
Kannst du mir noch ein wenig bei der konkreten Umsetzung helfen? Wie könnte ich mein Object an den Radiobutton binden? Bei MVC 2 gibt es ja keine Code-Behinds mehr, wie kriege ich da die Logik unter? Ich will das eben nicht dann alles in der Action des Controls abhandeln sondern hätte gerne ein Control, das mir einfach den gewählten Buchstaben zurückliefert.
Hast du da eine Implementierungsidee?

Danke!

Viele Grüße

TopperDEL

16.806 Beiträge seit 2008
vor 13 Jahren

Hi,

wenn Dir direkt am Controller das Objekt geben lässt ( was ja auch der Sinn von MVC ist ), dann hast Du durch den Radiobutton doch direkt in der jeweiligen Property den ausgewählten Buchstaben?!
Dazu muss ja nur der input-Name dem Property-Name entsprechen.

Bei MVC 2 gibt es ja keine Code-Behinds

Es gibt sie noch; man soll sie aber - wenn möglich - nicht nutzen.

2.891 Beiträge seit 2004
vor 13 Jahren

Guck dir mal Rendern eines Formulars in ASP.NET-MVC mit HTML-Hilfsmethoden an. Da ist sogar ein Beispiel mit RadioButtons drin.

Du machst einfach eine View (z.B. Home/Index) mit


<% using(Html.BeginForm("Answer", "Home")) %>
<% { %>
   <%= Html.RadioButton("answer", "A", false)%> Antwort A <br />
   <%= Html.RadioButton("answer", "B", false)%> Antwort B <br />
   <%= Html.RadioButton("answer", "C", false)%> Antwort C <br />
   <%= Html.RadioButton("answer", "D", false)%> Antwort D <br />
<% } %>

und im zugehörigen Controller eine Action mit der folgenden Signatur:


public ActionResult Answer(string answer)
{
   // ...
}

In answer steht jetzt dann "A", "B", "C" oder "D" drin.

Gruß,
dN!3L

T
topperdel Themenstarter:in
67 Beiträge seit 2007
vor 13 Jahren

Danke für eure Antworten!

Ich krieg's aber immer noch nicht hin.

  1. Problem: Kann ich mehrere BeginForms in einer Seite haben? Oder müsste ich dann alle vier Fragenblöcke in eine Form packen (wäre ja kein Problem).
  2. Problem - das richtige: wie kriege ich den Wert "gepost-backed"? Ich navigiere mit ActionLinks zwischen den Views, aber da bekomme ich den answer-Parameter nicht gefüllt, der ist immer null.

Steh ich wirklich so auf dem Schlauch?

Danke für eure Bereitschaft zu helfen!

T
topperdel Themenstarter:in
67 Beiträge seit 2007
vor 13 Jahren

Ok, jetzt klappt's!
Aus irgendeinem Grund habe ich keinen Submit-Button bekommen, sondern ein Eingabefeld. Ich weiß nicht mehr, was ich da anderes stehen hatte. Mit dem Submit-Button kriege ich den ausgewählten Wert gepostet.

Damit sollte dann klappen, was ich vorhabe.

Danke für eure Hilfe! Vielen Dank!

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo topperdel,
1.Steck alle Fragen in ein einziges Formular. 1.Sieh dir die Überladung LinkExtensions.ActionLink-Methode (HtmlHelper, String, String, Object) an. Dem letzte Parameter routeValues vom Typ object kannst du new { answer = "..." } (vom Typ dynamic) zuweisen.

HTTP ist ein zustandsloses Protokoll. ASP.NET WebForms simuliert einen Zustand durch den ViewState.
ASP.NET MVC abstrahiert nicht so sehr, wie es WebForms tut. Für die Arbeit mit MVC wird kein ViewState benötigt (was nicht heiß, dass man ihn nicht verwenden kann).){gray}

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg