2008-11-04 17 views
12

Ich versuche asp.net mvc für ein neues Projekt, und ich lief über etwas seltsam. Wenn ich die MVC-UI-Helfer für Textfelder verwende, bleiben die Werte zwischen den Anrufen erhalten. Aber wenn ich eine Reihe von Optionsfeldern verwende, bleibt der Status nicht erhalten.asp.net mvc radio button state

Hier ist ein Beispiel aus meiner Sicht.

Wenn das Formular zurückgebucht wird, baue ich ein Objekt mit "ProviderType" als eine seiner Eigenschaften. Der Wert für das Objekt wird festgelegt, und dann I RedirectToAction mit dem Anbieter als Argument. Alles ist gut, und ich lande bei einer URL wie "http://localhost/Provider/List?ProviderType=1" mit ProviderType zeigt. Der Wert wird für die URL beibehalten, aber der UI-Helfer hebt den aktivierten Status nicht auf.

Ich habe dieses Problem mit Listbox, Dropdown-Liste und Radiobutton. Textboxen nehmen die Werte gut auf. Siehst du etwas, was ich falsch mache? Ich gehe davon aus, dass die Helfer das für mich tun werden, aber vielleicht muss ich mich alleine darum kümmern. Ich fühle mich gerade so durch, so dass dein Input geschätzt wird.

Bearbeiten: Ich habe gerade die Überschreibung für den Konstruktor SelectList gefunden, die einen ausgewählten Wert nimmt. Das hat mein Dropdown-Problem, das ich oben erwähnt habe, gekürzt.

Bearbeiten # 2: Ich fand etwas, das funktioniert, aber es schmerzt mich, es so zu machen. Ich habe das Gefühl, dass dies gefolgert werden sollte.

<li> 
    <%=Html.RadioButton("ProviderType","1",Request["ProviderType"]=="1")%><label>Hospital</label> 
    <%=Html.RadioButton("ProviderType", "2", Request["ProviderType"] == "2")%><label>Facility</label> 
    <%=Html.RadioButton("ProviderType", "3", Request["ProviderType"] == "3")%><label>Physician</label> 
</li> 

Hoffentlich wird jemand mit einem anderen Weg kommen.

+2

Ich habe seit der offiziellen Veröffentlichung keine Probleme mehr gesehen. Es könnte etwas mit den Betas sein oder etwas, was ich falsch gemacht habe. Trotzdem denke ich, dass diese Frage nicht mehr relevant ist. –

Antwort

1

Das Formular sollte nicht in den Querystring gebucht werden, es sei denn, Sie haben vergessen, das Formular als method = "POST" anzugeben. Wie spezifizieren Sie das Formular? Verwenden Sie ASP.NET MVC Beta?

0

Logischerweise würde es nicht bestehen, es gibt keinen Sitzungszustand. Betrachten Sie es als eine völlig neue Seite. Um Ihre Optionsfelder zum Auffüllen zu bringen, müssen Sie etwas wie ViewData ["ProviderType"] = 3 beibehalten, damit der Radiobutton mit seinen Daten neu gefüllt wird.

3

Was Sie brauchen, ist so etwas wie dies in der Ansicht:

<% foreach(var provider in (IEnumerable<Provider>)ViewData["Providers"]) { %> 
    <%=Html.RadioButton("ProviderType", provider.ID.ToString(), provider.IsSelected)%><label><%=provider.Name%></label> 
<% } %> 

Und dann in Ihrem Controller haben dies:

var providers = GetProviders(); 
int selectedId = (int) Request["ProviderType"]; // TODO: Use Int32.TryParse() instead 
foreach(var p in providers) 
{ 
    if (p.ID == selectedId) 
    { 
     p.IsSelected = true; 
     break; 
    } 
} 
ViewData["Providers"] = providers; 
return View(); 

Die Provider-Klasse so etwas wie dies sein wird:

public class Provider 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 
} 
6

Wenn Sie den Optionsschaltflächen den gleichen Namen wie der Eigenschaft in Ihrem Modell geben, wird MVC automatisch die ch festlegen Attribut auf der entsprechenden Schaltfläche

Ich denke, das beruht auf einem stark typisierten Modell. jetzt

1

Ich bin mit VS2010, funktioniert es wie:

<%=Html.RadioButton("ProviderType","1",Model.ProviderType==1)%><label>Hospital</label> 

sieht besser aus?

-1

Ausblick:

<%=Html.RadioButton("providerType","1")%><label>Hospital</label> 
<%=Html.RadioButton("providerType","2")%><label>Facility</label> 
<%=Html.RadioButton("providerType","3")%><label>Physician</label> 

Controller:

public ActionResult GetType(FormCollection collection) 
{ 
string type=collection.Get("providerType"); 

    if(type=="1") 
    //code 
    else if(type=="2") 
    //code 
    else 
    //code 

return View(); 
} 
0

ich diesen HTML Helper Erweiterung vorgenommen haben:

<Extension()> _ 
    Public Function RadioButtonList(ByVal helper As HtmlHelper, ByVal name As String, ByVal Items As IEnumerable(Of String)) As String 
     Dim selectList = New SelectList(Items) 
     Return helper.RadioButtonList(name, selectList) 
    End Function 

    <Extension()> _ 
    Public Function RadioButtonList(ByVal helper As HtmlHelper, ByVal Name As String, ByVal Items As IEnumerable(Of SelectListItem)) As String 
     Dim sb As New StringBuilder 
     sb.Append("<table class=""radiobuttonlist"">") 
     For Each item In Items 
      sb.AppendFormat("<tr><td><input id=""{0}_{1}"" name=""{0}"" type=""radio"" value=""{1}"" {2} /><label for=""{0}_{1}"" id=""{0}_{1}_Label"">{3}</label></td><tr>", Name, item.Value, If(item.Selected, "selected", ""), item.Text) 
     Next 
     sb.Append("</table>") 
     Return sb.ToString() 
    End Function 

Dann in der Ansicht:

<%= Html.RadioButtonList("ProviderType", Model.ProviderTypeSelectList) %> 

In der Steuerung die Option automatisch mit dem Standard zugeordnet ist:

UpdateModel(Provider) 

Arbeiten wie ein Charme. Wenn Sie Tablebrechig sind, ändern Sie das generierte Markup.