@ Html.CheckBoxFor возвращает Невозможно неявно преобразовать тип 'string' в ошибку 'bool' - PullRequest
0 голосов
/ 22 декабря 2011

все

Я пытаюсь использовать @ Html.CheckBoxFor. Вот мой код:

Модель:

public bool WC0001 { get; set; }

Вид:

@using (Html.BeginForm("ListSearch", "Committee", FormMethod.Get))
{
    @Html.CheckBoxFor(model => model.WC0001)&nbsp;<label for="WC0001" class="mrg_r20">Development</label>
}

Я также использую WebGrid. Когда я нажимаю на страницу 2, я получаю эту ошибку. Не удается неявно преобразовать тип 'string' в 'bool'

Итак, я посмотрел на URL. Это "http://localhost:28685/Committee/ListSearch?WC0001=true%2cfalse&page=2"

Почему я получаю параметр WC0001 как true% 2cfalse? И какой обходной путь для этого? Это не случилось, когда я публиковал форму. Но так как я изменил его как FormMethod.Get из-за WebGrid, это начало происходить. Пожалуйста, кто-нибудь, помогите мне.

EDIT: enter image description here

Вот что происходит при перезагрузке страницы.

EDIT:

Вот мой код действия:

[HttpGet]
public ActionResult ListSearch(Kuksiwon.Models.Committee profile, FormCollection collection)
{
    DataTable _dt = _bp.DtReturnS(false
        , "WSP_KW100_R1"
        , profile.APJIKJONGCODE == null ? "" : profile.APJIKJONGCODE
        , profile.APKUKSICODE == null ? "" : profile.APKUKSICODE
        , profile.CTNAME == null ? "" : profile.CTNAME
        , collection["CTSEXList"] == null ? "" : collection["CTSEXList"].ToString()
        , profile.CTOADDRESS1 == null ? "" : profile.CTOADDRESS1
        , profile.CTOADDRESS2 == null ? "" : profile.CTOADDRESS2
        , profile.CTUNIVCODE1 == null ? "" : profile.CTUNIVCODE1
        , profile.CTHOSPCODE1 == null ? "" : profile.CTHOSPCODE1
        , profile.CTETCNAME == null ? "" : profile.CTETCNAME
        , profile.CTUNIVDIV1 == null ? "" : profile.CTUNIVDIV1
        , profile.CTUNIVJIKUP1 == null ? "" : profile.CTUNIVJIKUP1
        , profile.CTEMAIL == null ? "" : profile.CTEMAIL
        , profile.WC0001 ? "WC0001" : ""
        , profile.WC0002 ? "WC0002" : ""
        , profile.WC0003 ? "WC0003" : ""
        , profile.WC0004 ? "WC0004" : ""
        , profile.WC0005 ? "WC0005" : ""
        , profile.WC0006 ? "WC0006" : ""
        , profile.WC0007 ? "WC0007" : ""
        , profile.WC0008 ? "WC0008" : ""
        , profile.WCNONE ? "1" : "0"
        , profile.RSNAME == null ? "" : profile.RSNAME
        , profile.BKNAME == null ? "" : profile.BKNAME
        , profile.CTSUBJECT == null ? "" : profile.CTSUBJECT
        , profile.CTCOLLEGE == null ? "" : profile.CTCOLLEGE
    );
    ViewBag.ListSearch = _dt;

    profile.CTSEXList = profile.CommonCodeList("SX", "1");
    return View(profile);
}

Ответы [ 3 ]

1 голос
/ 05 декабря 2012

Это ошибка (ну, я считаю это ошибкой) в том, что MVC выплевывает для @ Html.CheckBoxFor () - она ​​плюет на фактический флажок ввода, но также на скрытое поле с тем же именем.Они делают это так, чтобы сообщение HTTP получило значение по умолчанию (если флажок снят), все еще отправленное вместе с данными.Но для GET браузер отправляет оба значения в строке запроса, заставляя его выходить на сервер в виде массива строк (что приводит к вашему исключению).

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

$('input[type=checkbox] ~ input[type=hidden]').each(function() {
    var curHiddenField = $(this);
    var checkBox = curHiddenField.prev();
    checkBox.change(function () {
        curHiddenField.val(checkBox[0].checked);
        if (checkBox[0].checked) {
            curHiddenField.attr('disabled', 'disabled');
        } else {
            curHiddenField.removeAttr('disabled');
        }
    }).change();
});
0 голосов
/ 22 декабря 2011

Пройдя некоторое тестирование, я думаю, что мог выяснить вашу проблему.

Как вы, вероятно, знаете, рендеринг CheckBox приводит к <input type="checkbox" /> и <input type="hidden" /> с одинаковыми именами. Если флажок установлен, при отправке формы GET / POST будет иметь повторяющиеся записи для этого поля:
ListSearch?WC0001=true&WC0001=false
MVC обрабатывает эти значения как массив строк ["true", "false"], и когда он связывается с bool, он анализирует только первый элемент массива.

Возможно, вы уже поняли проблему сейчас. Ваш пример URL объединяет эти значения в:
ListSearch?WC0001=true,false
MVC будет обрабатывать это значение как одну строку "true,false", что означает, что он НЕ сможет связываться с bool!

Проблема почти наверняка вызвана некоторым JavaScript, который создает URL, и сценарий, вероятно, пытается быть умным и комбинировать повторяющиеся входные данные в список через запятую. Это не сработает для MVC, поэтому вам нужно хранить значения отдельно.

0 голосов
/ 22 декабря 2011

Единственная возможная причина, по которой я могу подумать, может вызвать эту проблему, если ваш ModelState был изменен с недопустимым значением.Это был бы единственный способ получить ошибку при рендеринге страницы.

Вы должны проверить ModelState в вашем контроллере следующим образом:

var wc0001 = ModelState["WC0001"].Value;
var raw = wc0001.RawValue; // Should be ["true", "false"]
var attempted = wc0001.AttemptedValue; // Should be "true,false"
var converted = wc0001.ConvertTo(typeof(bool)); // If this fails, then Html.CheckBoxFor will fail too.

Обновление:

Посмотрев на ваш метод действия, я не вижу ничего, что могло бы вызвать недопустимый ModelState.Пожалуйста, дайте мне знать значения .RawValue и .AttemptedValue, потому что они, вероятно, будут иметь некоторое представление о причине этой проблемы.

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