0

我正在尝试对 select 元素使用客户端验证,但在表单最初加载时它不起作用。

这是我的模型中的属性(这实际上是在我的模型中的一个类中):

[Required(ErrorMessage="Please select an application type.")]
public override string Application
{
    get
    {
        return base.Application;
    }
    set
    {
        base.Application = value;
    }
}

这是视图的一部分

<div class="field_title">
    Application Type
</div>
<div class="field_validation">
    @Html.ValidationMessageFor(model => model.CreatePromocode.Application)
</div>
<div class="form_field">
    @Html.DropDownListFor(model => model.CreatePromocode.Application,
        SharedLibrary.Entities.DropDownLists.PromocodeApplicationOptions,
        "Select an application type...")
</div>

这是下拉列表项代码,我这样做是为了在其他应用程序上使用它,只需在一个地方而不是几个地方进行更改

public class DropDownLists
{        
    public static List<SelectListItem> PromocodeApplicationOptions
    {
        get
        {
            return new List<SelectListItem>()
            {
                new SelectListItem() { 
                    Text="Earlybird Registration", Value="Earlybird"},
                new SelectListItem() { 
                    Text="Standard Registration", Value="Standard"},
                new SelectListItem() { 
                    Text="Monday Registration", Value="Monday"},
                new SelectListItem() { 
                    Text="Tuesday Registration", Value="Tuesday"},
                new SelectListItem() { 
                    Text="Wednesday Registration", Value="Wednesday"},
                new SelectListItem() { 
                    Text="Multiple Tickets", Value="TicketMany"},
                new SelectListItem() { 
                    Text="Single Ticket",Value="TicketSingle"}
            };
        }
    }
}

我遇到的问题是,当用户第一次到达页面时,下拉列表没有任何客户端验证属性。看起来像这样

<select id="CreatePromocode_Application" name="CreatePromocode.Application">

但是,一旦发布了表单,并且由于尚未选择应用程序类型而导致 ModelState 无效,客户端验证就会出现在下拉列表中并且可以正常工作。

<select data-val="true" 
    data-val-required="Please select an application type." 
    id="CreatePromocode_Application"
    name="CreatePromocode.Application" 
    class="valid">

如何从一开始就进行客户端验证?我宁愿不必手动添加必需的属性和错误消息,因为它有点违背使用数据注释的目的。

4

1 回答 1

1

确保您正在初始化视图模型的 CreatePromoCode 属性,就像在此示例的默认构造函数中一样:

public class YourViewModel
{
    public YourViewModel()
    {
        CreatePromoCode = new CreatePromoCode();
    }

    public BaseCreatePromoCode CreatePromoCode { get; set; }

}

public class BaseCreatePromoCode
{
    public virtual string Application { get; set; }

}

public class CreatePromoCode : BaseCreatePromoCode
{
    [Required]
    public override string Application { get; set; }
}

HtmlHelper 将使用视图模型的 CreatePromoCode 属性的运行时类型,以获取其属性的元数据并设置客户端验证的数据属性。(因此,即使只在派生类上实际设置了 Required 属性,验证也将起作用。)

当初始发布后出现错误时,MVC 绑定器已创建视图模型和 CreatePromoCode 对象的实例。如果您再次渲染要显示的错误视图,因为对象已被初始化,数据属性将被设置并且客户端验证开始工作。

于 2012-11-20T00:13:03.560 回答