Ответ 1
Вы должны изменить OtherPlaceProvinceId от int до int?,
public int? OtherPlaceProvinceId { get; set; }
В моем проекте у меня есть модель, в которой вы можете увидеть часть моей модели здесь:
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);
}
Вы должны изменить OtherPlaceProvinceId от int до int?,
public int? OtherPlaceProvinceId { get; set; }
Установлен ли флажок OtherPlace? Значение по умолчанию для флажка on
, если оно отмечено и пустое, если оно отсутствует. ModelBinder не понимает этого.
ASP.Net обращается к этому, если вы используете помощников, делая это:
<input type="checkbox" name="OtherPlace" value="true"/>
<input type="hidden" name="OtherPlace" value="false"/>
Теперь будет показано, что модельный блок, установленный на флажке, был отмечен галочкой или нет, преобразуйте его в логическое и привяжите его к вашей модели.
Вы также можете использовать переключатели с истинными/ложными значениями
Обмен моим случаем и решением. В моем случае я передавал модель контроллеру, используя jquery (пост Ajax).
<input type="checkbox" id="OtherPlace" name="OtherPlace" value="true"/>
ошибка заключалась в том, что я получал "val()" из OtherPlace вместо свойства Checked
Неправильно:
var otherPlace = $('#OtherPlace').val();
Правильно:
var otherPlaces = $('#OtherPlace').prop('checked');
Надеюсь, это поможет
Хитрость заключается в том, чтобы присвоить значение, а также обработать проверено. Как упоминалось в других ответах, значение по умолчанию для флажка "включено", если оно установлено, и пустое, если нет, но вы все равно можете его переопределить.
Ниже я обрабатываю проверенный атрибут, а также присваиваю значение. Я использую bool? потому что это то, что обычно приводит вас к этому типу проблем. Если вы используете тип bool, вы можете использовать тег helper.
<input type="checkbox" id="myBoolField" name="myBoolField" value="@(Model.myBoolField??false)" @(Model.myBoolField??false == true? "checked:checked":"") />
Я сделаю обходной путь, когда у вас не слишком много входов с этим поведением.
Это просто, прежде чем отправлять форму, перехватите входные данные строкой '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();" />