验证错误消息:字段PositionId必须是数字

时间:2014-11-12 11:13:48

标签: asp.net-mvc-4

我有三个单选按钮和一个位置下拉列表。根据选择的单选按钮,下拉列表中的项目将使用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; }
}

1 个答案:

答案 0 :(得分:0)

如果你检查帮助器生成的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()在内部由data-val-调用以呈现html。

不引人注意的验证通过解析元素并循环每个"The field PositionID must be a number."属性来实现第一个&#39;规则&#39;添加的是验证其编号。如果您尝试提交表单并且&#34;请选择位置&#34;选择了选项,验证器响应第一个错误int(它不会继续检查更多错误并将它们连接起来)

请注意,您的属性为[Required],因此实际上并不需要intdata-val-required必须始终具有值,因此无论如何都会添加string

除非您要将属性更改为$(ddltarget).append($('<option></option>').val('').text('--Please select Position--')); ,否则您看到的是默认行为。

另请注意:当您添加&#39;标签&#39;使用javascript的选项,你应该给它一个&#39; null&#39;否则,它会回复标签&#39;

的文字
<option value>--Please select Position--</option>

将生成

.val('')

没有<option>--Please select Position--</option> ,它会生成

"--Please select Position--"

表示将{{1}}张贴回来