2012-03-30 114 views
6

我有一个模型类“Country”,其属性“CultureId”未标记为必需。另一个类“CountryViewModel”拥有相同的属性“CultureId”。ASP.NET MVC为非必填字段添加验证

当呈现“创建”视图时,我注意到验证数据属性被添加到“CultureId”文本框中,虽然没有添加数据注释。

我使用

@Html.HiddenFor(mode => mode.CultureId) 

什么可能是这种行为的原因是什么?

感谢

回答

0

如果你可以使用数据标注,你应该看看这个http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute.aspx

namespace MvcApplication1.Models 
{ 
[MetadataType(typeof(MovieMetaData))] 
public partial class Movie 
{ 
} 


public class MovieMetaData 
{ 
    [Required] 
    public object Title { get; set; } 

    [Required] 
    [StringLength(5)] 
    public object Director { get; set; } 


    [DisplayName("Date Released")] 
    [Required] 
    public object DateReleased { get; set; } 
} 

}

它可以帮助您设置验证,而不在数据库方面的模型。

+0

他的问题不在于如何设置属性上的必需条件,而是如何避免他正在运行的不需要的html验证。 此外,您的管理属性的方式是典型的动态数据,而不是MVC通常工作的方式 – themarcuz 2012-03-30 08:41:40

+0

我认为它将覆盖验证规则,如果元数据类将为空 – 2012-03-30 09:08:47

12

我猜你的CultureId是一个int。 MVC自动将所需标记添加到不可为空的值类型。

要关闭添加

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

到的Application_Start或让你的INT可空

+0

已经添加,并且仍然是相同的行为。我会尽量使int为空。谢谢 – Bill 2012-03-30 10:17:49

+1

很好的答案。它的作用是摆脱“数据需求”验证,但由于Id是一个'int',它添加了'data-val-number',它在尝试创建时仍然阻止表单提交。我可以通过设置默认值0来解决这个问题,但我不应该这么做。 – eudaimos 2012-10-27 05:00:42

+0

我的不好 - 它的工作原理是验证似乎跳过隐藏输入的“data-val-number” – eudaimos 2012-10-27 07:00:51

0

试试这个:

ModelState["CultureId"].Errors.Clear(); 

if (ModelState.IsValid)  
    { 
     ..... 
    } 

如果CultureId是整数,那么它也会给你想要的结果...

+1

这是一个可以避免这里涉及的真正问题的混合物。请参阅[从dskh获取更多答案](http://stackoverflow.com/a/9941032/237838)。 – 2013-02-07 19:28:21

8

有几种方法可以处理e这 -
a)。使财产为可空对象如

public int? Age { get; set; } 

b)。在控制器类中使用以下内容 -

ModelState["Age"].Errors.Clear(); 

c)。添加到启动 - DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;