のために真であることからModelMetadata.IsRequiredを無効にするにはどうすれば単純なモデルを持っています。したがって、検証のためにGlobal.asaxにDataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false
を設定してください。は常にnull非許容値型
私もモデルが必要とされている場合はtrueまたはfalse出力する簡単なHTMLヘルパーを持っている:
public static class HtmlHelperExtensions
{
public static MvcHtmlString IsRequired<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
return new MvcHtmlString(metadata.IsRequired.ToString());
}
}
私も私の問題を披露するビューを書いた:
@model MvcApplication10.Models.Sample
A: @Html.IsRequired(m => m.A), B: @Html.IsRequired(m => m.B)
私が期待しているだろうこれはA: false, B: true
を印刷しますが、実際にはA: true, B: true
を出力します。
この印刷を期待通りの結果にする方法はありますか?私が明示的にRequiredAttribute
を設定していなくても、IsRequired
は常に真を返すようです。 docsは、デフォルトではヌル値を持たない値の型に対して真であると述べています。検証と同様に、これをfalseに設定する簡単な方法がないのはなぜですか?
EDIT:私はあなたがMVCのバグに直面していると思います
public class ExtendedDataAnnotationsModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
private static bool addImplicitRequiredAttributeForValueTypes = false;
public static bool AddImplicitRequiredAttributeForValueTypes
{
get
{
return addImplicitRequiredAttributeForValueTypes;
}
set
{
addImplicitRequiredAttributeForValueTypes = value;
}
}
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var result = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
if (!AddImplicitRequiredAttributeForValueTypes && modelType.IsValueType && !attributes.OfType<RequiredAttribute>().Any())
{
result.IsRequired = false;
}
return result;
}
}
'DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false'のは今自動的にnull非許容値は' RequiredAttribute'を添加しない期待される効果を持っていませんタイプ。 – Cocowalla