我今天在WCF合同中遇到过这个问题:
[DataMember(IsRequired = true)]
public DateTime? LastModified { get; set; }
Run Code Online (Sandbox Code Playgroud)
可以IsRequired = True
和可空的后果是什么DateTime
?他们似乎彼此矛盾.
我想DataMember
在我DataContract
的一个中添加一个.我想知道DataMember
如果没有更新其中一方,现有服务器和客户端将如何在新的情况下运行.
我记得有一种方法可以DataMember
选择,但我想知道它是否适用于所有场景:
我创建了一个HtmlHelper for Label,如果需要关联字段,则在该Label的名称后面放置一个星号:
public static MvcHtmlString LabelForR<TModel, TValue>(
this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
return LabelHelper(
html,
ModelMetadata.FromLambdaExpression(expression, html.ViewData),
ExpressionHelper.GetExpressionText(expression),
null);
}
private static MvcHtmlString LabelHelper(HtmlHelper helper, ModelMetadata metadata, string htmlFieldName, string text)
{
... //check metadata.IsRequired here
... // if Required show the star
}
Run Code Online (Sandbox Code Playgroud)
如果我在我的ViewModel中的属性上使用DataAnnotations和slap [Required],我的私有LabelHelper中的metadata.IsRequired将等于True,并且一切都将按预期工作.
但是,如果我使用FluentValidation 3.1并添加一个简单的规则:
public class CheckEmailViewModelValidator : AbstractValidator<CheckEmailViewModel>
{
public CheckEmailViewModelValidator()
{
RuleFor(m => m.Email)
.NotNull()
.EmailAddress();
}
}
Run Code Online (Sandbox Code Playgroud)
...在我的LabelHelper metadata.IsRequired将被错误地设置为false.(验证器有效:你不能提交空字段,它需要像电子邮件一样).
其余元数据看起来正确(例如:metadata.DisplayName ="Email").
理论上,如果使用Rule .NotNull(),FluentValidator会在属性上使用RequiredAttribute.
对于参考:我的ViewModel:
[Validator(typeof(CheckEmailViewModelValidator))]
public class CheckEmailViewModel
{
//[Required] …
Run Code Online (Sandbox Code Playgroud) html-helper modelmetadata fluentvalidation asp.net-mvc-3 isrequired
我有一个WCF数据契约与一堆原始类型的属性,如int和decimal,DateTime
(当然,这是一个结构).
我的同事建议将它们全部为可空,然后通过检查null来验证服务端的必需值.我相信部分原因是因为它是一个可序列化的对象,所以你不能用数据契约上的构造函数强制执行所需的值 - 它避免了测试默认值的麻烦.
但是,我还希望在合同中隐含必需的属性,以便客户可以了解所需的属性.
所以不要做类似的事情,
[DataMember]
public Nullable<int> AgencyID { get; set; }
Run Code Online (Sandbox Code Playgroud)
这将允许我在服务端干净地测试null,我这样做:
[DataMember(IsRequired = true, EmitDefaultValue = true)]
public int AgencyID { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的理解是,如果没有为属性分配值或者默认值为0,这将抛出异常 - 这是所需的行为.这是在客户端执行所需属性的最佳实践吗?让一切都可以为空并在服务端检查它有什么好处吗?
isrequired ×4
wcf ×3
.net ×2
datacontract ×2
datamember ×2
c# ×1
html-helper ×1
non-nullable ×1