MVC Html.CheckBox и форма отправить вопрос - PullRequest
14 голосов
/ 18 марта 2009

Сумасшедшая проблема с отправкой значений в 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"}

В строке запроса Некоторые параметры отображаются дважды (нормальная ситуация), а некоторые только ОДИН РАЗ (только значение скрытого поля). Кажется, это не зависит от того, был ли установлен флажок или нет, изменилось ли значение или около того ...

Кто-нибудь сталкивался с такой ситуацией? Как я могу обойти?

Ответы [ 4 ]

16 голосов
/ 18 марта 2009
   <% 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
 }

причина, по которой вы проверяете ложь, потому что помощник Html Checkbox делает какие-то странные вещи для значения true

True возвращает как:

it makes the string read "true, false"

так что вы, возможно, думали, что это два значения, но это всего лишь одно и означает истину

Ложь возвращается как:

it makes the string read "false"
10 голосов
/ 18 марта 2009

Это на самом деле так, как он должен работать в соответствии со спецификациями.

Это не имеет ничего общего с ASP.NET MVC, но когда флажок не установлен, он не включается в коллекцию POST.

Вы получаете два значения, потому что у вас есть и флажок, и вход с тем же именем (и те, для которых у вас есть два значения, скорее всего, те, с установленными флажками).

Редактировать: технические характеристики из W3C

2 голосов
/ 18 марта 2009

Без необходимости запрашивать базу данных об идентификаторах после отправки формы / перед сохранением (режим без сохранения состояния) я создал такой код:

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

Спасибо вам, ребята, за помощь в решении этой проблемы!

0 голосов
/ 26 сентября 2012

Я использую это:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...