2008-11-04 15 views
12

Estoy probando asp.net mvc para un nuevo proyecto, y encontré algo extraño. Cuando uso los helpers MVI UI para cuadros de texto, los valores se mantienen entre llamadas. Pero, cuando uso una serie de botones de opción, el estado verificado no se conserva.asp.net mvc botón de opción estado

Aquí hay un ejemplo de mi vista.

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

Cuando se vuelve a publicar el formulario, construyo un objeto con "ProviderType" como una de sus propiedades. El valor en el objeto se establece, y luego redirijo a Action con el proveedor como argumento. Todo está bien, y termino en una URL como "http://localhost/Provider/List?ProviderType=1" mostrando ProviderType. El valor se conserva en la URL, pero el asistente de UI no recupera el estado verificado.

Tengo este problema con listbox, dropdownlist , y radiobutton. Los cuadros de texto recogen los valores muy bien. ¿Ves algo que estoy haciendo mal? Asumo que los ayudantes harán esto por mí, pero tal vez tendré que encargarme de esto solo. Solo estoy sintiendo mi camino a través de esto, por lo que tu opinión es apreciada.

Editar: Acabo de encontrar la anulación para el constructor SelectList que toma un valor seleccionado. Eso se encargó de mi problema de lista desplegable que mencioné anteriormente.

Edit # 2: Encontré algo que funciona, pero me duele hacerlo de esta manera. Siento que esto debería inferirse.

<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> 

Esperemos que a alguien se le ocurra otra manera.

+2

No he visto más problemas como este desde el lanzamiento oficial. Pudo haber sido algo con las betas o algo que estaba haciendo mal. Independientemente, no creo que esta pregunta sea relevante. –

Respuesta

1

El formulario no se debe publicar en la cadena de consulta, a menos que haya olvidado especificar el formulario como method = "POST". ¿Cómo estás especificando el formulario? ¿Estás utilizando ASP.NET MVC Beta?

0

Bien lógicamente no persistiría, no hay estado de sesión. Piénselo como una página completamente nueva. Para que sus botones de radio se completen, debe persistir algo como ViewData ["ProviderType"] = 3 para que el radiobutton reponga sus datos.

3

Lo que necesita es algo como esto en su opinión:

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

Y luego, en el controlador de tener esta:

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(); 

La clase Proveedor será algo como esto:

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

Si le da a los botones de opción el mismo nombre que la propiedad en su modelo, entonces MVC configurará automáticamente atributo ecked en el botón apropiado.

Creo que esto se basa en tener un modelo fuertemente tipado.

1

estoy usando VS2010 ahora, funciona como:

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

se ve mejor?

-1

Vista:

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

controlador:

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

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

return View(); 
} 
0

He hecho esta extensión ayudante HTML:

<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 

A continuación, en la vista:

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

En el controlador de la opción se asigna automagicamente utilizando el estándar:

UpdateModel(Provider) 

funciona como un encanto. Si es fotófobo, cambie el marcado generado.

Cuestiones relacionadas