Estoy tratando de formular una solución para la falta de un "grupo de casilla" en ASP.NET MVC. La forma típica de implementar esto es tener casillas de verificación del mismo nombre, cada una con el valor que representa.ASP.NET MVC Checkbox Grupo
<input type="checkbox" name="n" value=1 />
<input type="checkbox" name="n" value=2 />
<input type="checkbox" name="n" value=3 />
Cuando presentado, se delimitan por comas todos los valores de la posición de solicitud "n" .. así lo soliciten [ "n"] == "1,2,3" si los tres se comprueban cuando se presente. En ASP.NET MVC, puede tener un parámetro de n como matriz para aceptar esta publicación.
public ActionResult ActionName(int[] n) { ... }
Todo lo anterior funciona bien. El problema que tengo es que cuando la validación falla, las casillas de verificación no se restauran a su estado verificado. Alguna sugerencia.
Código Problema: (I comenzó con la asp.net mvc proyecto por defecto)
controlador
public class HomeController : Controller
{
public ActionResult Index()
{ var t = getTestModel("First");
return View(t);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(TestModelView t)
{ if(String.IsNullOrEmpty(t.TextBoxValue))
ModelState.AddModelError("TextBoxValue", "TextBoxValue required.");
var newView = getTestModel("Next");
return View(newView);
}
private TestModelView getTestModel(string prefix)
{ var t = new TestModelView();
t.Checkboxes = new List<CheckboxInfo>()
{ new CheckboxInfo(){Text = prefix + "1", Value="1", IsChecked=false},
new CheckboxInfo(){Text = prefix + "2", Value="2", IsChecked=false}
};
return t;
}
}
public class TestModelView
{ public string TextBoxValue { get; set; }
public List<CheckboxInfo> Checkboxes { get; set; }
}
public class CheckboxInfo
{ public string Text { get; set; }
public string Value { get; set; }
public bool IsChecked { get; set; }
}
}
ASPX
<%
using(Html.BeginForm()){
%> <p><%= Html.ValidationSummary() %></p>
<p><%= Html.TextBox("TextBoxValue")%></p>
<p><%
int i = 0;
foreach (var cb in Model.Checkboxes)
{ %>
<input type="checkbox" name="Checkboxes[<%=i%>]"
value="<%= Html.Encode(cb.Value) %>" <%=cb.IsChecked ? "checked=\"checked\"" : String.Empty %>
/><%= Html.Encode(cb.Text)%><br />
<% i++;
} %></p>
<p><input type="submit" value="submit" /></p>
<%
}
%>
Código de Trabajo
Controlador
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(TestModelView t)
{
if(String.IsNullOrEmpty(t.TextBoxValue))
{ ModelState.AddModelError("TextBoxValue", "TextBoxValue required.");
return View(t);
}
var newView = getTestModel("Next");
return View(newView);
}
ASPX
int i = 0;
foreach (var cb in Model.Checkboxes)
{ %>
<input type="checkbox" name="Checkboxes[<%=i%>].IsChecked" <%=cb.IsChecked ? "checked=\"checked\"" : String.Empty %> value="true" />
<input type="hidden" name="Checkboxes[<%=i%>].IsChecked" value="false" />
<input type="hidden" name="Checkboxes[<%=i%>].Value" value="<%= cb.Value %>" />
<input type="hidden" name="Checkboxes[<%=i%>].Text" value="<%= cb.Text %>" />
<%= Html.Encode(cb.Text)%><br />
<% i++;
} %></p>
<p><input type="submit" value="submit" /></p>
Por supuesto, algo similar se podría hacer con HTML ayudantes, pero esto funciona.
Coloque el código de su controlador. –
Como dicen en The Matrix; no hay estado;) http: // stackoverflow.com/questions/1473483/asp-net-mvc-and-viewstate – magnus
@magnus: Eso es mucho por lo que probablemente sea un problema simple en el controlador. –