Ошибка проверки: значение 'on' недействительно для << имени свойства >>

В моем проекте у меня есть модель, в которой вы можете увидеть часть моей модели здесь:

public class CheckoutModel
{
    public bool OtherPlace { get; set; }

    [RequiredIf("OtherPlace", true, ErrorMessage = " ")]
    public string OtherPlaceFullName { get; set; }

    [RequiredIf("OtherPlace", true, ErrorMessage = " ")]
    public int OtherPlaceProvinceId { get; set; }

    [RequiredIf("OtherPlace", true, ErrorMessage = " ")]
    public string OtherPlaceCity { get; set; }
}

Я использовал атрибут RequiredIf для проверки моей модели в представлении,

 if (!ViewData.ModelState.IsValid)
    {
        @Html.ValidationSummary(false)
    }

Я заполняю все свойство своей формы, но ниже ошибки проверки, когда OtherPlaceProvinceId не заполняется.

Значение 'on' недействительно для OtherPlace.

UPDATE: контроллер находится здесь:

    [HttpGet]
    public ActionResult CheckoutAccount()
    {
        var model = OrderManager.Instance.GetCheckoutAccount();
        return View("_CheckoutAccount", model);
    }

    [HttpPost]
    public ActionResult CheckoutAccount(CheckoutAccountModel model)
    {
        return View("_CheckoutAccount", model);
    }

Ответ 1

Вы должны изменить OtherPlaceProvinceId от int до int?,

public int? OtherPlaceProvinceId { get; set; }

Ответ 2

Установлен ли флажок OtherPlace? Значение по умолчанию для флажка on, если оно отмечено и пустое, если оно отсутствует. ModelBinder не понимает этого.

ASP.Net обращается к этому, если вы используете помощников, делая это:

<input type="checkbox" name="OtherPlace" value="true"/>
<input type="hidden" name="OtherPlace" value="false"/>

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

Вы также можете использовать переключатели с истинными/ложными значениями

Ответ 3

Обмен моим случаем и решением. В моем случае я передавал модель контроллеру, используя jquery (пост Ajax).

<input type="checkbox" id="OtherPlace" name="OtherPlace" value="true"/>

ошибка заключалась в том, что я получал "val()" из OtherPlace вместо свойства Checked

Неправильно:

var otherPlace = $('#OtherPlace').val();

Правильно:

var otherPlaces = $('#OtherPlace').prop('checked');

Надеюсь, это поможет

Ответ 4

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

Ниже я обрабатываю проверенный атрибут, а также присваиваю значение. Я использую bool? потому что это то, что обычно приводит вас к этому типу проблем. Если вы используете тип bool, вы можете использовать тег helper.

<input type="checkbox" id="myBoolField" name="myBoolField" value="@(Model.myBoolField??false)" @(Model.myBoolField??false == true? "checked:checked":"") />

Ответ 5

Я сделаю обходной путь, когда у вас не слишком много входов с этим поведением.
Это просто, прежде чем отправлять форму, перехватите входные данные строкой 'on' и измените ее на значение true/false.

function toggle_validator(e) {
    if ($('#OtherPlace').val() == 'on') {
        $('#OtherPlace').val(true);
    }
    else {
        $('#OtherPlace').val(false);
    }
}

И нам нужно привязать это событие к кнопке, которая отправляет форму.

<input type="submit" value="Save" class="btn btn-success" onclick="toggle_validator();" />