2011-10-06 19 views
6

我创建自己的自定义ValidationAttribute定制ValidationAttribute在视图模型不点火的IsValid函数调用

public class UrlValidationAttribute : ValidationAttribute 
{ 
    public UrlValidationAttribute() {} 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
      return true; 

     var text = value as string; 
     Uri uri; 

     return (!string.IsNullOrWhiteSpace(text) && 
       Uri.TryCreate(text, UriKind.Absolute, out uri)); 
    } 
} 

我使用的是在我的车型之一,它完美的作品。不过,现在我试图使用它在一个视图模型:

public class DeviceAttribute 
{ 
    public DeviceAttribute(int id, attributeDefinition, String url) 
    { 
     ID = id; 
     Url = url; 
    } 

    public int ID { get; set; } 

    [UrlValidation] 
    public String Url { get; set; } 
} 

视图模型在局部视图中使用这样的:

@model List<ICMDB.Models.DeviceAttribute> 

<table class="editor-table"> 

@foreach (var attribute in Model) 
{ 
    <tr> 

     @Html.HiddenFor(a => attribute.ID) 

     <td class="editor-label"> 
      @Html.LabelFor(a => attribute.Url) 
     </td> 

     <td class="editor-field"> 
      @Html.TextBoxFor(a => attribute.Url)    
      @Html.ValidationMessageFor(a => attribute.Url) 
     </td> 

    </tr> 
} 

</table> 

对于一些未知的原因,而构造函数UrlValidationAttribute触发,IsValid函数不会触发。有任何想法吗?

编辑:在进一步调查中,似乎发生了这种情况,因为DeviceAttribute视图模型实际上是部分视图模型。整个页面将传递一个包含DeviceAttribute视图模型列表的不同视图模型。因此,当我的控制器操作被调用时,将构建完整页面视图模型并填充其值,但不会构建视图模型,因此不会执行验证。

+0

也许尝试覆盖@protected覆盖ValidationResult IsValid(对象值,ValidationContext validationContext)@ - 这是应覆盖ValidationAttribute的方法。注意:确保您使用验证上下文中的成员信息调用ValidationResult的ctor。 –

+0

也试过了,没有工作。我认为这是一个事实,这是一个事实,这是在一个局部视图,所以'List '不传递回控制器进行验证... – link664

回答

-1

我会推荐你​​使用编辑器模板而不是编写foreach循环。我想,你的主视图模型看起来是这样的:

public class MyViewModel 
{ 
    public List<DeviceAttribute> Devices { get; set; } 
    ... 
} 

现在,在你的主要观点:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    <table class="editor-table"> 
     @Html.EditorFor(x => x.Devices) 
    </table> 
    <input type="submit" value="OK" /> 
} 

,并在相应的编辑器模板(~/Views/Shared/EditorTemplates/DeviceAttribute.cshtml):

@model DeviceAttribute 
<tr> 
    @Html.HiddenFor(x => x.ID) 

    <td class="editor-label"> 
     @Html.LabelFor(x => x.Url) 
    </td> 

    <td class="editor-field"> 
     @Html.TextBoxFor(x => x.Url)    
     @Html.ValidationMessageFor(x => x.Url) 
    </td> 
</tr> 

而且您的POST操作将视图模型带回:

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    ... 
} 

现在,默认模型联编程序将成功绑定视图模型中的所有值并启动验证。

这是关于模板的nice blog post

+0

发现这并没有工作。 – Bardicer

相关问题