【问题标题】:Html.DropDownList not validatingHtml.DropDownList 未验证
【发布时间】:2012-05-01 14:34:33
【问题描述】:

我认为有这段代码:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"type="text/javascript"></script>

...  

    <div class="modal_label">
        @Html.LabelFor(model => model.Organization.Type)
    </div>
    <div class="modal_field">
        @Html.DropDownListFor(model => model.Organization.Type, (IEnumerable<SelectListItem>)ViewBag.TypeList, String.Empty)
        @Html.ValidationMessageFor(model => model.Organization.Type)
    </div>

如果我将@Html.DropDownFor 更改为@Html.EditorFor,则验证工作正常,但在这种情况下,我呈现了以下html:

 <select id="Organization_Type" name="Organization.Type" class="valid">
 ...
 </select>

这是我的模型:

[MetadataType(typeof(OrganizationMetaData))]
public partial class Organization
{

}

public class OrganizationMetaData
{
    [Required(ErrorMessageResourceType = typeof(CCMESResources.ResourceErrors),ErrorMessageResourceName = "ValueIsRequired")]
    public int Type { get; set; }
}

当表单发布时,ModelState 中有错误。你能帮帮我吗?

【问题讨论】:

  • 您可以在视图顶部添加@Html.ValidationSummary() 并向我们准确展示您遇到的错误。您确定它与 Type 属性有关吗?
  • 它不会显示任何验证消息,直到它发布并且控制器中存在错误

标签: asp.net-mvc razor


【解决方案1】:

确保您在视图模型上使用了可为空的类型:

[Required]
public int? Type { get; set; }

在您的模型中,您似乎使用了一个不可为空的整数,这与您试图在视图中实现的目标不一致。

还要确保您发布此表单的控制器操作将视图模型作为操作参数。

【讨论】:

  • 我已将 int 更改为 int?但它不起作用......我也在其他视图中完成了这种验证,其中参数不可为空并且它工作正常
  • 你能提供一个完整而简洁的例子让我们重现问题吗?
  • 事实是 Type 不可为空这一事实并没有改变任何东西。它正在服务器端进行验证
【解决方案2】:

在您的模型(或视图模型)中,当您从下拉列表中为其分配一个值时,如果第一个选择的值是空字符串或 null,它“应该”触发验证,但它会走一趟到服务器去做。在没有先发帖的情况下,我无法成功地在客户端进行不显眼的验证。为所需值使用可为空的字段通常不是一个好主意。此外,由于您没有使用可为空的字段,因此当您检查模型是否有效时,它应该强制验证。这是我项目中的一个有效的 sn-p(另外,我使用 data annotation extensions 作为“Min”注释):

型号:

[Display(Name = "Ticket Priority")]
[Min(1, ErrorMessage = "You must select a ticket priority.")]
public int TicketPriorityID { get; set; }

查看:

<div class="editor-label">
    @Html.LabelFor(model => model.TicketPriorityID)
</div>
<div class="editor-field">
    @Html.DropDownList("TicketPriorityID", string.Empty)
    @Html.ValidationMessageFor(model => model.TicketPriorityID)
</div>

控制器(HttpGet):

ViewBag.TicketPriorityID = new SelectList(db.TicketPriorities.OrderBy(x => x.TicketPriorityID).ToList(), "TicketPriorityID", "Name");

控制器(HttpPost):

if (ModelState.IsValid)
{
    ...
}

【讨论】:

  • 验证与必需属性一起正常工作。我在 ModelState 中看到了这一点,其中存在需要组织类型的错误。我不明白为什么它在客户端不起作用
  • 我认为它与下拉列表有关。我之前读过,您甚至不应该验证下拉列表,但在这种情况下,如果您希望空值成为默认值,则需要这样做。我不能给你一个很好的答案,为什么这在客户端不起作用。我有同样的问题。
  • 好的,非常感谢 Eric Garrison。现在我该回家了。如果您找到问题的答案,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多