我的页面上有某些面板在某些情况下是隐藏的.
例如,我可能有"帐单邮寄地址"和"送货地址",如果选中"ShippingSameAsBilling"复选框,我不想验证"送货地址".
我试图使用ASP.NET MVC 2(预览1)的新DataAnnotations功能来实现这一目标.
我需要防止在未显示"送货地址"时对其进行验证,并且需要找到实现此目的的方法.我主要讨论服务器端而不是使用jquery.
我怎样才能做到这一点?我有几个想法,与自定义模型绑定有关,但我目前最好的解决方案如下.有关此方法的任何反馈?
我在MVC2应用程序中使用数据注释,并且在尝试将RESX文件资源用于错误消息时有点气馁.
我已经尝试了以下但继续获得异常"属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式"
[Required(ErrorMessage = Resources.ErrorMessages.Required)]
[Required(ErrorMessageResourceName = Resources.ErrorMessages.Required,
ErrorMessageResourceType = typeof(Resources.ErrorMessages)]
Run Code Online (Sandbox Code Playgroud)
我不断收到该错误消息,除非我替换ErrorMessageResourceName为"必需"而不是Resources.ErrorMessages.Required.
任何人都可以告诉我,如果我这样做的话吗?
我可以使用哪种正则表达式来匹配(允许)来自任何语言的任何类型的字母
我需要匹配任何字母,包括任何变音符号(例如á,ü,ñ等),并排除任何类型的符号(数学符号,货币符号,装饰符号,框图字符等)和标点字符.
我正在使用带有.net 4的asp.net MVC 2.我在我的视图模型中尝试过这个注释:
[RegularExpression(@"\p{L}*", ...
Run Code Online (Sandbox Code Playgroud)
还有这个:
[RegularExpression(@"\p{L}\p{M}*", ...
Run Code Online (Sandbox Code Playgroud)
但客户端验证不起作用.
更新: 感谢您的所有答案,您的建议工作,但仅适用于.net,这里的问题是它还使用正则表达式进行客户端验证与JavaScript(抱歉,如果这还不够清楚).我不得不去:
[!?^ 0-9_\|°¬#\ $%/ \()\¡¿+ {} []:\; @ª^*<> =&]*
这是非常丑陋的,并不涵盖所有场景,但最接近我需要的东西.
我通过继承ValidationAttribute创建了一个自定义验证属性.该属性在类级别应用于我的viewmodel,因为它需要验证多个属性.
我压倒一切
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
Run Code Online (Sandbox Code Playgroud)
并返回:
new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });
Run Code Online (Sandbox Code Playgroud)
在所有情况下,DateOfBirth是我的视图模型上的属性之一.
当我运行我的应用程序时,我可以看到它被击中.ModelState.IsValid正确设置为false但是当我检查ModelState内容时,我看到Property DateOfBirth不包含任何错误.相反,我有一个值为null的空字符串Key和一个包含我在验证属性中指定的字符串的异常.
这导致在使用ValidationMessageFor时,我的UI中不显示任何错误消息.如果我使用ValidationSummary,那么我可以看到错误.这是因为它与属性无关.
它看起来好像忽略了我在验证结果中指定了membername的事实.
为什么这样,我该如何解决?
要求的示例代码:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class ExampleValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// note that I will be doing complex validation of multiple properties when complete so this is why it is a class level attribute
return new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });
} …Run Code Online (Sandbox Code Playgroud) 我必须在我的模型中为username属性使用Regular表达式验证器.我从配置文件中获取此正则表达式.
[RegularExpression(UsernameValidationExpression)] //UsernameValidationExpression = value from the config file
public string UserName { get; set; }
Run Code Online (Sandbox Code Playgroud)
这里我得到一个错误"属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式"
我怎么解决这个?
我正在编写一个MVC3应用程序,它从数据库中读取大量货币数据.我的问题是这些金额都是不同的货币.
如果我设置这样的字段类型:
[DataType(DataType.Currency)]
public Amount{ get; set;}
Run Code Online (Sandbox Code Playgroud)
我得到小数位和货币符号,看起来不错,但它默认为用户的本地货币.美国用户看到$423.29GB用户看到£423.29.我可以通过<globalization culture="{something}">在Web.config中使用a来覆盖货币,但这会全局设置所有货币字段.
标记字段的最简单方法是什么,以便使用正确的小数位和货币符号进行渲染?
在一个理想的世界里,我希望能够做到这样的事情(美元):
[DataType(DataType.Currency, culture="en-us")]
public Amount{ get; set; }
Run Code Online (Sandbox Code Playgroud)
并且总是呈现为$439.38,但内置注释是不可能的.
尝试编译VelocityDB for android时,我收到了附加的错误消息.由于VelocityDB支持表示它确实需要数据注释.
引用的'System.ComponentModel.DataAnnotations.dll'是否适用于Android和iOS?
谢谢Jozsef
错误消息:"错误1加载程序集时出现异常:System.IO.FileNotFoundException:无法加载程序集'System.ComponentModel.DataAnnotations,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'.也许它不存在于Mono for Android profile?文件名:'System.ComponentModel.DataAnnotations.dll'at Monodroid.Tuner.MonoDroidResolver.Resolve(AssemblyNameReference reference,ReaderParameters parameters)at Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(List`1 assemblies,AssemblyDefinition程序集)在Xamarin.Android.Tasks.ResolveAssemblies.Execute()"
.NET Framework中是否有一种方法可以将某些方法或验证器用于使用Data Annotations修饰其类,并接收错误集合?
我看到有一种方法可以在.NET 4.x中执行此操作.但.NET 3.5中是否有类似的机制?
我知道在Razor View文件中,我们可以做这样的事情@Html.TextBox("username",null,new {maxlength = 20,autocomplete ="off"})
但是,我希望为MVC创建一个模型,该模型可用于创建一个明确定义文本框大小和最大长度的表单.我在模型的属性上尝试[StringLength(n)],但这似乎只进行验证而不是设置文本框的大小.
无论如何,我们可以将文本字段的长度定义为模型属性顶部的数据注释吗?
因此,最终,我们可以通过使用razor映射到模型来创建整个表单,而不是逐个明确地拾取模型属性以设置文本框大小.
我有一个案例,复杂的局部视图需要根据部分视图的使用位置进行不同的字段验证.
我认为我可以通过使局部视图将接口作为模型类型并基于接口实现两个不同的ViewModel来解决这个问题.两个ViewModel中的数据注释会有所不同.然后,我将向部分视图提供正确的ViewModel的实例.
但我发现,唯一被识别的注释是界面本身的注释.实现ViewModel类的接口上的DA被忽略,即使这些是作为模型传递的对象.所以我的计划不起作用.
有没有解决的办法?更好的方法?如果可以避免,我宁愿不将局部视图拆分为单独的视图.
ETA:这是部分视图的缩写版本,如下所示:
@model IPerson
@Html.ValidationSummary(false)
<fieldset>
<table class="editForm">
<tr>
<td class="editor-label">
@Html.LabelFor(model => model.FirstName)
</td>
<td class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</td>
<td class="editor-label">
@Html.LabelFor(model => model.LastName)
</td>
<td class="editor-field">
@Html.EditorFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</td>
</tr>
</table>
<fieldset>
Run Code Online (Sandbox Code Playgroud)
真正的局部视图很长,有很多@if语句管理可选部分的渲染(或不渲染),但它没有做任何棘手的事情.
data-annotations ×10
asp.net-mvc ×4
.net ×2
validation ×2
.net-3.5 ×1
c# ×1
currency ×1
database ×1
interface ×1
razor ×1
regex ×1
resx ×1
unicode ×1
xamarin.ios ×1