Asp.net mvc MVC 3中不引人注目的下拉验证

Asp.net mvc MVC 3中不引人注目的下拉验证,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,因此,下面的链接概述了MVC 3/使用下拉列表进行不引人注目的验证的问题。实际上,下拉列表不会发出客户端验证脚本。是否有一个简单的解决方法?当这个bug在最终发布之前就被报告时,我对MVC3是如何发布的感到困惑。在我们等待修复时,是否有一个简单的解决方案浮出水面 也许只有我一个人在这方面,但似乎验证表单的所有元素都很重要。:) 啊,这很奇怪,因为下面这些对我来说非常好 视图模型: public class MyViewModel { [Required] public strin

因此,下面的链接概述了MVC 3/使用下拉列表进行不引人注目的验证的问题。实际上,下拉列表不会发出客户端验证脚本。是否有一个简单的解决方法?当这个bug在最终发布之前就被报告时,我对MVC3是如何发布的感到困惑。在我们等待修复时,是否有一个简单的解决方案浮出水面

也许只有我一个人在这方面,但似乎验证表单的所有元素都很重要。:)


啊,这很奇怪,因为下面这些对我来说非常好

视图模型:

public class MyViewModel
{
    [Required]
    public string SelectedItem { get; set; }

    public IEnumerable<SelectListItem> Items
    {
        get
        {
            return Enumerable.Range(1, 5).Select(x => new SelectListItem
            {
                Value = x.ToString(),
                Text = "item " + x
            });
        }
    }
}
视图:

@使用AppName.Models
@模型MyViewModel
@使用(Html.BeginForm())
{
@Html.DropDownListFor(
x=>x.SelectedItem,
新的选择列表(Model.Items、“Value”、“Text”),
“--请选择一个项目--”
)
@Html.ValidationMessageFor(x=>x.SelectedItem)
}

保留下拉列表而不选择值,客户端验证将立即触发。

啊,这很奇怪,因为下面的操作对我来说非常好

视图模型:

public class MyViewModel
{
    [Required]
    public string SelectedItem { get; set; }

    public IEnumerable<SelectListItem> Items
    {
        get
        {
            return Enumerable.Range(1, 5).Select(x => new SelectListItem
            {
                Value = x.ToString(),
                Text = "item " + x
            });
        }
    }
}
视图:

@使用AppName.Models
@模型MyViewModel
@使用(Html.BeginForm())
{
@Html.DropDownListFor(
x=>x.SelectedItem,
新的选择列表(Model.Items、“Value”、“Text”),
“--请选择一个项目--”
)
@Html.ValidationMessageFor(x=>x.SelectedItem)
}

不选择值而保留下拉列表,客户端验证将立即触发。

它似乎对我也很有效

   <p>                                                         
       <p>
            <span class="lbl"> @Html.LabelFor(x => x.SelectedTimeZone, " Select a TimeZone: ")</span>
            <span>@Html.DropDownListFor(x => x.SelectedTimeZone, Model.TimeZones)</span>
            <span class="validation-error">@Html.ValidationMessageFor(x => x.SelectedTimeZone)</span>    
        </p>

它似乎对我也很管用

   <p>                                                         
       <p>
            <span class="lbl"> @Html.LabelFor(x => x.SelectedTimeZone, " Select a TimeZone: ")</span>
            <span>@Html.DropDownListFor(x => x.SelectedTimeZone, Model.TimeZones)</span>
            <span class="validation-error">@Html.ValidationMessageFor(x => x.SelectedTimeZone)</span>    
        </p>

我意识到这个问题已经得到了回答,但在过去的一天里,我一直在努力解决这个问题,试图弄明白为什么上面的示例工作正常,但我的代码却没有

事实证明,如果您尝试使用与所设置属性相同的名称将选择列表放入ViewData或ViewBag中,那么客户端验证将无法工作。但是,下拉列表将填充,因此它是高度非直观的

//不要这样做:
//在控制器中:
ViewBag.ItemID=Database.Items.Select(i=>newselectListItem(){Value=i.ID,Text=i.Name});
//他认为:
@Html.DropDownList(“ItemID”)
//而是这样做
//在控制器中:
ViewBag.ItemIDList=Database.Items.Select(i=>newselectListItem(){Value=i.ID,Text=i.Name});
//他认为:
@DropDownListFor(m=>m.ItemID,(IEnumerable)ViewBag.ItemIDList)
虽然前者产生了一个功能完善的下拉列表,但不知何故它没有得到客户端验证。如果检查HTML,“select”元素上的所有属性都不存在

这与MVC中其他字段或编辑器的填充方式完全相反,因为您可以通过设置ViewBag.ItemName=“Bob”来设置默认值和当前值,如果您有“ItemName”文本框,它将填充“Bob”


希望我发布这篇文章能让人省去几个小时的头痛。

我意识到这个问题已经得到了回答,但在过去的一天里,我一直在努力解决这个问题,试图弄明白为什么上面的例子可以很好地工作,但我的代码却没有

事实证明,如果您尝试使用与所设置属性相同的名称将选择列表放入ViewData或ViewBag中,那么客户端验证将无法工作。但是,下拉列表将填充,因此它是高度非直观的

//不要这样做:
//在控制器中:
ViewBag.ItemID=Database.Items.Select(i=>newselectListItem(){Value=i.ID,Text=i.Name});
//他认为:
@Html.DropDownList(“ItemID”)
//而是这样做
//在控制器中:
ViewBag.ItemIDList=Database.Items.Select(i=>newselectListItem(){Value=i.ID,Text=i.Name});
//他认为:
@DropDownListFor(m=>m.ItemID,(IEnumerable)ViewBag.ItemIDList)
虽然前者产生了一个功能完善的下拉列表,但不知何故它没有得到客户端验证。如果检查HTML,“select”元素上的所有属性都不存在

这与MVC中其他字段或编辑器的填充方式完全相反,因为您可以通过设置ViewBag.ItemName=“Bob”来设置默认值和当前值,如果您有“ItemName”文本框,它将填充“Bob”


希望我发布这篇文章能让人省去同样长时间的头痛。

您可以将所需的data-*属性附加到元素,这样它们就可以被不引人注目的验证脚本获取

@Html.DropDownListFor(x => x.People, new SelectList(Model.People,"Id", "Name"), "Select Person", new Dictionary<string, object>() {{ "data-val", "true" }, { "data-val-required", "Please select a person" }} )
@Html.DropDownListFor(x=>x.People,新选择列表(Model.People,“Id”,“Name”),“Select Person”,新字典(){{{“data val”,“true”},{“data val required”,“请选择一个人”})

您可以将所需的data-*属性附加到元素,以便通过不引人注目的验证脚本获取它们

@Html.DropDownListFor(x => x.People, new SelectList(Model.People,"Id", "Name"), "Select Person", new Dictionary<string, object>() {{ "data-val", "true" }, { "data-val-required", "Please select a person" }} )
@Html.DropDownListFor(x=>x.People,新选择列表(Model.People,“Id”,“Name”),“Select Person”,新字典(){{{“data val”,“true”},{“data val required”,“请选择一个人”})

有两件事似乎打破了这里的模式。一个是为复杂类型设置下拉列表。所以如果你有类似于
新人{Address=newaddress{}
,则
DropDownListFor(m=>m.Person.Address.State,someItems)
将不会验证。此外,如果您将属性命名为与
someItems
相同的名称。第二个问题很容易解决,但第一个问题是一个真正的问题。有两件事似乎打破了这个模式。一个是为复杂类型设置下拉列表。所以如果你有类似于
新人{Address=newaddress{}
,则
DropDownListFor(m=>m.Person.Address.State,someItems)
将不会验证。此外,如果您将属性命名为与
someItems
相同的名称。第二个问题很容易解决,但第一个问题确实存在