флажок, возвращающий «true, false» из formcollection вместо выбранного значения - PullRequest
2 голосов
/ 10 марта 2012

у меня есть несколько флажков на моей странице aspx с использованием HtmlHelper.CheckBox

и когда форма отправляется с использованием ajax, как показано ниже в файле js var input = $(':input');

   $.ajax({
    type: 'POST',
    url: "/Home/Post",
    data: input,
    dataType: 'json',
    success: function () {

    },
    });

и в методе действия контроллера, как показано ниже ..

 public ActionResult Post(FormCollection Form)
 {

 }

и в форме я не получаю обновленные значения для флажков, т.е. все значения флажков были возвращается как "правда, ложь". если какой-либо из флажков не установлен или не отмечен ... Форма не возвращается как ложная, она все равно возвращается как "истина, ложь" вместо ложных.

даже я пытался как

Form.Get("checkbox0").ConvertTo(typeof(Boolean))

Request.Form["checkbox0"]

код aboce возвращает "true, false", но флажок0 не установлен, поэтому он должен возвращать false, чего не происходит .... ???

Но когда я попытался использовать Html.BeginForm("Post","Home",FormMethod.Post,new {id="x"}) в файле aspx и убрал вызов ajax в файл js ... тогда форма formcollection в контроллере начинает давать мне ожидаемые значения для флажков ... но так как этот подход мерцает страница за страницей ... мне нужно использовать только подход ajax ..

Пожалуйста, дайте мне знать, как я могу получить обновленное значение флажка из формы коллекции при использовании ajax .

Ответы [ 4 ]

11 голосов
/ 16 апреля 2012

Вы всегда можете попробовать это:

bool checkedValue = Form["checkbox0"].Contains("true");
3 голосов
/ 10 марта 2012

Попробуй так:

$.ajax({
    type: 'POST',
    url: '/Home/Post',
    data: $('form').serialize(),
    dataType: 'json',
    success: function () {

    },
});

А также я бы порекомендовал вам использовать модель вида:

[HttpPost]
public ActionResult Post(MyViewModel model)
{
    ...
}

где, например, у вас есть список значений:

public class MyViewModel
{
    public ItemViewModel[] Items { get; set; }
}

public class ItemViewModel
{
    public int Id { get; set; }
    public bool IsSelected { get; set; }
}

и для которого вы создали список флажков в строго типизированном представлении:

<% for (var i = 0; i < Model.Items.Length; i++) { %>
    <%= Html.HiddenFor(x => x.Items[i].Id) %>
    <%= Html.CheckBoxFor(x => x.Items[i].IsSelected) %>
<% } %>
1 голос
/ 05 декабря 2014

Попробуйте это

string abc =  ((string[])(collection.GetValue("checkbox0").RawValue))[0];
0 голосов
/ 03 мая 2016

Я также столкнулся с той же проблемой, а затем наткнулся на ссылку ниже http://www.mindstorminteractive.com/topics/jquery-fix-asp-net-mvc-checkbox-truefalse-value/

$(window).load(function () {
    $("input:checkbox").each(function () {
        fixHiddenCheckField(this);
    });

    $("input:checkbox").change(function () {
        fixHiddenCheckField(this);
    });
});

function fixHiddenCheckField(checkField) {
    var name = $(checkField).attr("name");
    var hiddenSelector = "input:hidden[name=" + name + "]";
    var checkBoxesInListSelector = "input:checkbox[name=" + name + "]";
    var checkedCheckBoxesInListSelector = "input:checked[name=" + name + "]";

    if ($(checkedCheckBoxesInListSelector).length >= 1 || $(checkBoxesInListSelector).length > 1) {
        $("input").remove(hiddenSelector);
    }
    else {
        if ($(hiddenSelector).length == 0)
            $(checkField).parents("form").append("<input type='hidden' name='"+name+"' value='false' />");
    }
}

В блоге объясняется, что приведенный выше код удаляет скрытое поле при установке флажка, затем добавляядублировать один обратно в родительскую форму, когда не отмечен. Для обработки списков, проверяя общую длину флажков с этим именем.Если их несколько, предполагается, что это список, поэтому мы удаляем скрытые поля.Если нам нужен непроверенный список для получения одного значения false, просто не проверяйте $ (checkBoxesInListSelector) .length> 1 в операторе if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...