MVC Html.CheckBox и проблема с отправкой формы
Сумасшедшая проблема с отправкой значений в Html.Checkbox в ASP.NET MVC RC
Некоторые из значений просто не попадают в Request.Params
В моей форме у меня есть эта строка внутри цикла:
<%=Html.CheckBox("cb" + p.Option.Id, p.Option.IsAllowed, new { value = 6 })%>
и он отображает следующее:
<input checked="checked" id="cb17" name="cb17" type="checkbox" value="6" />
<input name="cb17" type="hidden" value="false" />
<input checked="checked" id="cb18" name="cb18" type="checkbox" value="6" />
<input name="cb18" type="hidden" value="false" />
<input id="cb19" name="cb19" type="checkbox" value="6" />
<input name="cb19" type="hidden" value="false" />
<input id="cb20" name="cb20" type="checkbox" value="6" />
<input name="cb20" type="hidden" value="false" />
<input checked="checked" id="cb21" name="cb21" type="checkbox" value="6" />
<input name="cb21" type="hidden" value="false" />
После отправки формы я получаю что-то вроде:
Form.Params["cb17"] = {6, "false"}
Form.Params["cb18"] = {6, "false"}
Form.Params["cb19"] = {"false"}
Form.Params["cb20"] = {"6,false"}
Form.Params["cb21"] = {"false"}
В строке запроса Некоторые из параметров отображаются дважды (нормальная ситуация), а некоторые только ОДНО ВРЕМЯ (только значение скрытого поля).
Кажется, что это не зависит от того, был ли флажок установлен или нет, изменилось ли значение или так...
Кто-нибудь сталкивался с такой ситуацией? Как я могу работать?
Ответы
Ответ 1
<% using(Html.BeginForm("Retrieve", "Home")) %>//Retrieve is the name of the action while Home is the name of the controller
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
и в вашем контроллере
List<app>=newApps; //Database bind
for(int i=0; i<app.Count;i++)
{
var checkbox=Request.Form[""+app[i].ApplicationId];
if(checkbox!="false")// if not false then true,false is returned
}
причина, по которой вы проверяете значение false, потому что помощник Html Checkbox делает какую-то причудливую вещь для значения true
True возвращает как:
it makes the string read "true, false"
так что вы, возможно, подумали, что это два значения, но только один, и означает true
False возвращает как:
it makes the string read "false"
Ответ 2
Это действительно то, как он должен работать в соответствии со спецификациями.
Он не имеет ничего общего с ASP.NET MVC, но если флажок не установлен, он не содержит не в коллекции POST.
Вы получаете два значения, потому что у вас есть флажок и ввод с тем же именем (и те, для которых у вас есть два значения, скорее всего, те, чьи флажки отмечены).
Изменить: спецификации от W3C
Ответ 3
Без необходимости запрашивать базу данных об идентификаторах после отправки формы/перед сохранением (режим без состояния), я создал такой код:
foreach (string key in Request.Form)
{
var checkbox = String.Empty;
if (key.StartsWith("cb"))
{
checkbox = Request.Form["" + key];
if (checkbox != "false")
{
int id = Convert.ToInt32(key.Remove(0, 2));
}
}
}
Спасибо вам, ребята, чтобы помочь мне решить эту проблему!
Ответ 4
Я использую это:
public struct EditedCheckboxValue
{
public bool Current { get; private set; }
public bool Previous { get; private set; }
public bool Changed { get; private set; }
public EditedCheckboxValue(System.Web.Mvc.FormCollection collection, string checkboxID) : this()
{
string[] values = collection[checkboxID].Split(new char[] { ',' });
if (values.Length == 2)
{ // checkbox value changed, Format: current,old
Current = bool.Parse(values[0]);
Previous = bool.Parse(values[1]);
Changed = (Current != Previous);
}
else if (values.Length == 1)
{
Current = bool.Parse(values[0]);
Previous = Current;
Changed = false;
}
else
throw new FormatException("invalid format for edited checkbox value in FormCollection");
}
}
а затем вызовите его следующим образом:
EditedCheckboxValue issomething = new EditedCheckboxValue(collection, "FieldName");
instance.IsSomething = issomething.Current;