我正在使用ASP.NET MVC2并尝试使用System.ComponentModel.DataAnnotations命名空间中的属性验证我的视图模型.
如何动态设置RangeAttribute的允许有效范围?例如,如果我想验证输入的日期是否在预期范围内.
这不编译:
[Range(typeof(DateTime),
DateTime.Today.ToShortDateString(),
DateTime.Today.AddYears(1).ToShortDateString())]
public DateTime DeliveryDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
因为"属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式".
我是否需要求助于创建自己的自定义验证器?
假设我有这个视图模型:
public class MyModel
{
[Range(0, 999, ErrorMessage = "Invalid quantity")]
public int Quantity { get; set; }
}
现在,对于此模型的特定实例,有效值的范围将更改:某些可能不会为0,有些可能不会高于5.有效范围的最小值/最大值来自数据库,可以随时更改.
如何动态更改RangeAttribute的最小/最大属性?或者它是验证我的场景的最佳方式?
我是第一次使用MVC 4.我的业务逻辑有点复杂,但我想不会那么罕见.我有可以在特定范围内调整大小的项目.范围取决于项目.
public class MyItem
{
public double Width { get; set; }
public double MinWidth { get; set; }
public double MaxWidth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
CustomWidth当用户设置时必须在内部MinWidth并且MaxWidth包含在内.这似乎是一个常见的问题.我已经尝试了该CustomValidation属性,但它只在我尝试将实体保存到我的数据库时才使用(使用实体框架).
这是我正在使用的Razor页面.
@using (Html.BeginForm("Action", "Controller", FormMethod.Post)) {
<aside id="aside">
<div class="editor-label">
@Html.LabelFor(model => model.Width)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Width)
@Html.ValidationMessageFor(model => model.Width)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Height)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Height)
@Html.ValidationMessageFor(model => model.Height)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Depth)
</div> …Run Code Online (Sandbox Code Playgroud) 这是我的模特:
[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")]
public string Phone { get; set; }
[ForeignKey]
public long PhoneType { get; set; } // 1-CellPhone , 2-Phone
Run Code Online (Sandbox Code Playgroud)
所以如果我想说更具体的话,我想改变RegularExpressionValidation by Change PhoneType:
如果用户CellPhone从DropDownList验证中选择
[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")]
Run Code Online (Sandbox Code Playgroud)
如果选择Phone验证
[RegularExpression("^[1-9][0-9]{9}$", ErrorMessage = "Invalid Number!")]
Run Code Online (Sandbox Code Playgroud)
你的建议是什么?