【问题标题】:validation error message:The field PositionId must be a number验证错误信息:字段 PositionId 必须是数字
【发布时间】:2014-11-12 11:13:47
【问题描述】:

我有三个单选按钮和一个位置下拉列表。根据单选按钮的选择,下拉列表中的项目使用 JSON 动态填充。 验证时,显示验证错误消息:“字段 PositionId 必须是数字。” 应该是“请选择位置”。代码如下。请指导我。谢谢。

查看:

<div class="panel-body">
            <div class="row-fluid">
                <div class="span1" style="text-align: right;">@Html.RadioButtonFor(m => m.CompanyType, "", new { id = "India", @checked = true, onclick = "ShowHideControls('India')", style = "margin-bottom:5px"})</div>
                <div class="span3">@Html.LabelFor(m => m.CompanyType, "India")</div>
            </div>
            <div class="row-fluid">
                <div class="span1" style="text-align: right;">@Html.RadioButtonFor(m => m.CompanyType, "", new { id = "USA", onclick = "ShowHideControls('USA')", style = "margin-bottom:5px"})</div>
                <div class="span3">@Html.LabelFor(m => m.CompanyType, "USA")</div>
            </div>
            <div class="row-fluid">
                <div class="span1" style="text-align: right;">@Html.RadioButtonFor(m => m.CompanyType, "", new { id = "UK", onclick = "ShowHideControls('UK')", style = "margin-bottom:5px" })</div>
                <div class="span3">@Html.LabelFor(m => m.CompanyType, "UK")</div>
            </div>
</div>
<div id="position" class="row-fluid">
                <div class="span3">@Html.LabelFor(m => m.PositionId, "Position")</div>
                <div class="span3">@Html.DropDownListFor(m => m.PositionId, (IEnumerable<SelectListItem>)ViewBag.PositionList, "--Please select Position--", new { id = "PositionList" })</div>
                <div class="span4"><font color="red">@Html.ValidationMessageFor(m => m.PositionId)</font></div> 
            </div>

function getPositions(code) 
{
    var url = '@Url.Content("~/")' + "Registration/GetPositions";
    var ddltarget = '#PositionList';
    $.getJSON(url, { Code: code }, function (data) {
    $(ddltarget).empty();
    $(ddltarget).append("<option>--Please select Position--</option>");
    $.each(data, function (index, optionData) {
    $(ddltarget).append("<option value=" + optionData.Value + ">" + optionData.Text + "</option>");
   });
  });
}

Controller:
public JsonResult GetPositions(string code)
{
	DataTable dt = registrationBLO.GetParameters(code);
	List<SelectListItem> positions = new List<SelectListItem>();
        foreach (DataRow dr in dt.Rows)
        {
             positions.Add(new SelectListItem { Text = dr["PARAM_VALUE"].ToString(), Value = dr["PARAM_ID"].ToString() });
        }
        return Json(positions, JsonRequestBehavior.AllowGet);
}

Model:
public class Registration
{
    public int CompanyType { get; set; }
 
    [DataType(DataType.Text)]
    [Required(ErrorMessage = "Please select Position")]
    public int PositionId { get; set; }
    public string PositionName { get; set; }
}

【问题讨论】:

  • 所有选项(包括动态加载的)的value属性是数字吗?
  • 是的。选项值是数字

标签: asp.net-mvc-4


【解决方案1】:

如果你检查助手生成的 html,你会看到类似的东西

<select data-val="true" data-val-number="The field PositionID must be a number." data-val-required="Please select Position" id="PositionID" name="PositionID" class="input-validation-error">....</select>

请注意,第一个data-val- 属性是data-val-number="The field PositionID must be a number." 这是HtmlHelper.GetUnobtrusiveValidationAttributes() 方法的结果,该方法由@Html.DropDownListFor() 在内部调用以呈现html。

不显眼的验证通过解析元素并循环每个data-val- 属性来工作,因此添加的第一个“规则”是验证其数字。如果您尝试提交表单并且选择了“请选择职位”选项,则验证器会返回第一个错误 "The field PositionID must be a number."(它不会继续检查更多错误并将它们全部连接起来)

请注意,您的属性是 int,因此 [Required] 实际上并不是必需的(int 必须始终有一个值,因此无论如何都会添加 data-val-required)。

除非您将属性更改为string,否则您看到的是默认行为。

另请注意:当您使用 javascript 添加“标签”选项时,您应该给它一个“空”值,否则它将回发“标签”的文本

$(ddltarget).append($('<option></option>').val('').text('--Please select Position--'));

会生成

<option value>--Please select Position--</option>

没有.val(''),它会生成

<option>--Please select Position--</option>

这意味着"--Please select Position--" 将被回发

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多