验证错误:值“on”对&lt; <property name =“”>&gt; </property>无效

时间:2014-01-19 18:16:33

标签: c# asp.net-mvc asp.net-mvc-4

在我的项目中,我有一个模型,你可以在这里看到我模型的一部分:

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无效。

更新:控制器在这里:

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

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

5 个答案:

答案 0 :(得分:33)

OtherPlace是复选框吗?如果勾选了复选框,则默认值为on&amp;如果不是,则为空白。 ModelBinder不明白这一点。

如果您使用帮助程序,ASP.Net会处理此问题:

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

模型绑定器现在将勾选出勾选的复选框,将其转换为布尔值&amp;将它绑定到您的模型。

您还可以使用带有true / false值的单选按钮

答案 1 :(得分:0)

分享我的案例和解决方案.. 在我的情况下,我使用jquery(Ajax post)将模型传递给控制器​​..

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

错误在于我得到了&#34; val()&#34; of OtherPlace而不是Checked属性

错:

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

正确:

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

我希望这可能有所帮助

答案 2 :(得分:0)

诀窍是分配值并处理检查。 如其他答案所述,如果选中该复选框,则默认值为“ on”,否则为空白,但是您仍然可以覆盖它。

下面,我要处理选中的属性,还要分配一个值。我在用布尔?因为这通常会导致您遇到这类问题。如果您使用的是布尔类型,则可以改用标签助手。

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

答案 3 :(得分:0)

当您的行为没有太多输入时,我将采取一些解决方法。
很简单,在提交表单之前,使用 '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();" />

答案 4 :(得分:-3)

您应该将OtherPlaceProvinceId从int更改为int?,

public int? OtherPlaceProvinceId { get; set; }