| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

folgendes Problem beschäftigt mich schon seit einigen Tagen:
In einer Spalte innerhalb eines WebGrids möchte ich 4 RadioButtons anzeigen und PRO ZEILE nur eine Auswahlmöglichkeit bereitstellen
-> Nachname | Vorname | Option1 Option2 Option3 Option4
1. Zeile: tiger | entchen | o o o o
2. Zeile: tiger2 | entchen | o o o o
3. Zeile: tiger3 | entchen | o o o o

Problem: Es ist nicht möglich, pro Zeile nur eine Auswahl zu treffen. Eine Auswahl betrifft alle Zeilen. Jede RadionButton Spalte (z.B. Oprion1) kann insgesamt nur einmal selektiert werden und nicht pro Zeile (verständlich?).

Die Klammern () sollen eine Selektion darstellen.

Somit ist folgendes Szenario also nicht möglich:
1. Zeile: tiger | entchen | (o) o o o
2. Zeile: tiger2 | entchen | (o) o o o
3. Zeile: tiger3 | entchen | (o) o o o

Sondern nur dieses:
1. Zeile: tiger | entchen | (o) o o o
2. Zeile: tiger2 | entchen | o (o) o o
3. Zeile: tiger3 | entchen | o o (o) o

Laut Google müsste ich für jede Zeile ein RadioButton mit einer eigenen ID erstellen alla:
i = 0;
for(...)
{
// Wäre jetzt erstmal ein Button mit nur einer Option
Html.RadioButton(i.ToString(), option.Bezeichnung, true, new { optionID = option.optionID });
}

Nachteil hierbei wäre, dass ich beim Klicken z.B. auf Speichern irgendwie auf die ID zugreifen muss (müsste wohl jedes Controll auf den Namen hin prüfen) und gucken, ob der Anwender irgendwas gemacht hat.

Hat einer schonmal mit RadioButtons in einem WebGrid gearbeitet und könnte mir hier vielleicht weiterhelfen?
01.12.2011
tigerentchen 92 1 5
8 Antworten
1
Hallo

1.) Page.Request["value"] == Page.Request.QueryString["value]

Der QueryString enthält GET variablen aus deiner Url. Request.Params ist eine Verbindung aus: QueryString, Form, Cookies, und ServerVariables. Darum bekommst du in deinem Beispiel mit beidem das selbe Ergebnis.

2.) Du könntest die Page.Params collection iterieren und alles was mit "Option" beginnt herauslesen

var requestParams = new NameValueCollection();
requestParams.Add("Option0", "value0");
requestParams.Add("Option1", "value1");
requestParams.Add("Option2", "value2");
requestParams.Add("IrgendEtwasAnderes", "EinValue");

List<string> valueList = new List<string>();
foreach (var key in requestParams.AllKeys)
{
if (key.StartsWith("Option"))
{
valueList.Add(requestParams[key]);
}
}


Noch schicker wird es wenn du LINQ benutzt.

Grüße
10.12.2011
Nicolai Schönberg 2,4k 2 9
2
Hallo,

generell kann ich dir erstmal soviel sagen, das die RadioButton-Gruppen in HTML anhand des name Attributes gebildet werden. Es kann immer nur ein RadioButton pro Gruppe aktiviert sein.

Damit das möglich ist, musst du das name Attribut von den RadioButton so setzen, das die gewünschte Auswahl möglich wird so wie du es beschrieben hast. Das könnte generell so aussehen: Beispiel

Damit sollte dein erstes Problem vom Verständnis her klar sein, oder?

Nun dazu, wie ich vorschlagen würde die Daten zum Server zu übertragen, damit du nicht alle IDs prüfen musst - Du musst nicht mal alle RadioButton mit runat="server" makieren.

Möglichkeit mit jQuery:
$('#webgridid').serialize()


Mehr dazu was der Befehl macht findest du hier: jQuery.serialize()

Wenn du nicht extra jQuery einbinden willst, könntest du dir auf deine Seite ein verstecktes HTML Element legen:
<input type="text" runat="server" id="webgridValues" />"


Du kannst dann deine RadioButtons um ein onclick Event erweitern, welches die ID der ausgewählten RadioButtons in das versteckte Feld eintragen. Du musst dann natürlich auch Werte wieder herauslöschen, wenn jemand den RadioButton der selben Gruppe ändert. Ist ein wenig fummelkram, aber machbar. Am besten mit Semikolon getrennt die ID Werte hineinschreiben-

Bei dieser Möglichkeit bräuchtest du dann nur dein verstecktes Element zum Server übertragen und wieder auseinander brechen in die einzelnen Ids:
String.Split( new char {';'})


Grüße
01.12.2011
Nicolai Schönberg 2,4k 2 9
1
Hi,
also die View erhält ein ViewObjekt:
Hier sehr verkürzt aufgeführt:

// ViewData-Objekt
public class ViewData
{
public IEnumerable<User> User {get;set;}
public IEnumerable<Option> Optionen {get;set;}
}

// User-Objekt
// Daten werden aus Datenbank geholt
public class User
{
[Key]
public int UserID {get;set;}

public string Nachname {get;set;}
public string Nachname {get;set;}
}

// Option-Objekt
// Daten werden ebenfalls aus der Datenbank geholt (Stammdaten)
public class Optionen
{
[Key]
public int OptionID{ get; set; }
public string Bezeichnung { get; set; }
}
// Im Controller
public ActionResult Index()
{
// Hier wird das _viewModel-Objekt gefüllt
CreateViewModel();

return View(_viewModel);
}

// View
@model Beispiel.ViewModels.ViewData
@{
var gridUser = new WebGrid(Model.User);
}

// Erstellung JavaScripte und der View

// Erstellung des WebGrids
@gridUser.GetHtml(
columns: gridUser.Columns(
gridUser.Column("Nachname", "Nachname"),
gridUser.Column("Vorname", "Vorname"),
// Hier hätte ich nun gerne die RadioButtons mit den Optionen aus Model.Optionen
// Ich stelle mir das in etwa so vor (wobei das Beispiel auch schon fehlerhaft ist,
// wegen dem Object, welches ich übergebe (id = "1"):
gridUser.Column(format: (item) => Html.RadioButtonFor(result => result.Optionen, new {id = "1"}))
)
)


Mein Problem ist die Column, in der ich die RadioButtons erstellen möchte! Das gelingt mir nicht richtig (nämlich Auswhal nur pro Zeile und mit 4 Items).

Hoffe, dass euch dieser Codeschnipsel weiterhilft, damit ihr mir weiterhelfen könnt. :)
02.12.2011
tigerentchen 92 1 5
1
Elemente mit Namen kriegen JavaScript:
document.getElementsByName("name") // gibt ein array zurück


Ansonsten als Postback zum Server:

Request.Parmas["name"]


Grüße

PS: Knapper geschriebene Texte mit elementaren Code-Schnipseln sowie eine Frage pro "Thread" (eigentlich eine Frage pro Frage) ist hilfreich für die Übersicht.
09.12.2011
Nicolai Schönberg 2,4k 2 9
0
Hi,
erstmal vielen Dank für deine Antwort. Das Verständnis ist da, nur helfen mir die weiteren Ansätze in meinem Fall nicht weiter.
Dein Beispiel habe ich auf mein Bedürfnis geändert, damit klar wird, was ich haben möchte
korrigiertes Beispiel.
Nur hilft mir dieser Quelltext nicht wirklich weiter, weil
a) ich mit einem WebGrid arbeiten möchte (Paging, Sortierung, etc.),
b) sich die Zeilen dynamisch zur Laufzeit ändern können und ich nicht weiß, wie viele Zeilen ich letztendlich haben werde (keine Zeile, 5 Zeilen, 20 Zeilen - varriert). Im Beispiel habe ich eine bestimmte Menge.

Was ich also haben will ist eine Spalte im WebGrid mit einem RadioButton (eiegntlich einer RadioButtonList), welches min. 4 Items enthält und das pro Zeile, wie im korrigiertem Beispiel.
01.12.2011
tigerentchen 92 1 5
Hallo, ich weiß was du haben möchtest, jedoch nicht was dein Problem dabei ist es um zu setzen. Vll bringt ein wenig Sourcecode Licht ins dunkle
Nicolai Schönberg 02.12.2011
0
Hallo zusammen,
ein wenig Abstand vom Problem gemixt mit ein wenig Schlaf et voilà ein erster Lösungsansatz ist mir zugeflogen.
Folgende Idee zur Implementierung (bezieht sich nur noch auf die View, der andere "Krams" kann aus dem Code-Block meiner vorherigen Antwort entnommen werden):

// View
@model Beispiel.ViewModels.ViewData
@{
var gridUser = new WebGrid(Model.User);
var radioButtonIndex = 0;
}

// siehe vorherigen Codeschnipsel -> wichtig sind folgende Zeilen!
gridUser.Column(format: item =>
{
// Aktuelle Option wird aus vorheriger Selektion bestimmt
// und in einer Session zwischengespeichert -> Grund: Vorselektion der Option
string actualOption = (string)this.Session["ActualOption"];
string radioButtonName = string.Format("Option{0}",radioButtonIndex.ToString());
// Ist jetzt noch nicht komplett fertig (Beta-Phase) -> Vorselektion vorhanden?
if(!string.IsNullOrEmpty(actualOption))
{
if(actualOption== "Option1")
{
// mit Vorselektion
string option1 = string.Format(@"<input type=""radio"" name={0} checked=""checked""/>", radioButtonName);
}
}
else
{
// ohne Vorselektion
string option1 = string.Format(@"<input type=""radio"" name={0}/>", radioButtonName);
}
string option2 = string.Format(@"<input type=""radio"" name={0} />", radioButtonName);
string option3 = string.Format(@"<input type=""radio"" name={0} />", radioButtonName);
string option4 = string.Format(@"<input type=""radio"" name={0} />", radioButtonName);
radioButtonIndex++;
return new HtmlString(string.Format("{0}{1}{2}{3}", option1 , option2 , option3 , option4));
}),


Jetzt nur noch auf die Selektion im Controller (in der Controller-Klasse) reagieren und ich bin einigermaßen zufrieden mit der Lösung. Auf die Anmerkung, ob inline-Codeblöcke in er View ok sind oder nicht, sei jetzt dahingestellt...mir gehts um das Problem, was gelöst werden soll!

Wenn mir jetzt noch jmd. sagt, wie ich auf die RadioButtons-Controlls über den namen zugreifen kann, dem wäre ich sehr verbunden.
Die Namen der RadioButtons-Controlls sind dynamisch aber mit einem festen Anfangsnamen (Option{0} - wobei {0} ein int ist, welches hochgezählt wird (inkrement)).

Vielleicht kann es auch sein, dass ich den RadioButtons noch Ids hinzufügen muss, um über die Id auf das Control zugreifen zu können.

Über JQuery möchte ich ungerne auf die Selektion reagieren, außer mir sagt derjenige auch gleich, wie ich die Selektion in den Controller bekomme (oder im Controller verarbeiten kann). Denn nachdem eine Selektion getroffen wurde, kann der Anwender einen Prozess starten, in der die Selektion entscheidend ist. Der Prozess wird dann im Controller verarbeitet, daher brauche ich hier die Selektion aus der View.

Klar soweit? ;)
09.12.2011
tigerentchen 92 1 5
0
Hi,
den Weg mit dem Request bin ich auch gegangen, nur kann ich nicht auf die einzelnen Items innerhalb des RadioButtons zugreifen, um deren Status zu erfahren.

this.Request["Option0"]; // liefert "on" zurück 
Request.Params["Option0"]; // liefert ebenfalls "on" zurück

Beim Request mit Params hätte ich eine Auflistung mit allen Items der RadioButton(bspw. zu Option0) erwartet.

P.S.: Habe dolle ausgeholt, damit keine weitere Fragen zu meiner Frage aufkommen und man mir somit konkreter helfen kann.
Und für eine weitere Frage in diesem Zusammenhang wollte ich ungern einen neuen Thread aufmachen, sonst müsste ich das Problem ja wieder erklären...
09.12.2011
tigerentchen 92 1 5
0
Endlich habe ich die Lösung!
Der Input Tag des RadioButtons benötigt zusätzlich noch einen value. Als value würde ich dann die OptionID übergeben.

Somit ergibt sich folgender Code:
// Value erstmal hardcoded, wäre aber OptionID; name ist Option0
string option1 = string.Format(@"<input type=""radio"" name={0} value=""1"" />", radioButtonName);


Somit Liefert:
this.Request["Option0"] // Liefert 1, wegen Value

Gleiches gilt auch für die anderen Optionen (Option1, Option2, etc. - sofern vorhanden). Somit kann ich im Controller durch alle "Request" RadioButton-Gruppen (Option0, Option1, etc.) iterieren und mir den selektierten Wert holen.

Was ich damit erreicht habe:
1) Dynamisches hinzufügen mehrerer RadioButton-Gruppen (siehe Beispiel, wobei die Anzahl der User variiert, daher muss ich den name der RadioButton-Gruppe zur Laufzeit dynamisch erzeugen)
2) Auf einzelne Elemente innerhalb einer RadioButton-Gruppe kann ich zugreifen (über value).

Vielen Dank Nicolai für deine Unterstützung!
12.12.2011
tigerentchen 92 1 5
Kein Problem ;-) PS: Reputations Punkte werden gern genommen :)
Nicolai Schönberg 12.12.2011

Stelle deine .net-Frage jetzt!