MVC3 - 使用自定义属性jQuery不显眼的验证

问题描述:

我很难用jQuery不显眼的验证来抓住MVC3。MVC3 - 使用自定义属性jQuery不显眼的验证

我有一个表格,我需要用户输入至少一个字段,然后再作出POST请求。

我跟着Darin Dimitrov's Answer Here相当严重,但我似乎无法弄清楚如果没有字段有值,我需要做什么来阻止表单提交。

自定义属性:

Public Class AtLeastOneRequiredAttribute 
Inherits ValidationAttribute 
Implements IClientValidatable 

Private ReadOnly _properties As String() 

Public Sub New(ByVal properties As String()) 
    _properties = properties 
End Sub 

Protected Overrides Function IsValid(value As Object, validationContext As ValidationContext) As ValidationResult 
    If IsNothing(_properties) Or _properties.Length < 1 Then 
     Return Nothing 
    End If 

    For Each prop In _properties 
     Dim propertyInfo = validationContext.ObjectType.GetProperty(prop) 
     If IsNothing(propertyInfo) Then 
      Return New ValidationResult(String.Format("unknown property {0}", prop)) 
     End If 

     Dim propertyValue = propertyInfo.GetValue(validationContext.ObjectInstance, Nothing) 
     If TypeOf propertyValue Is String AndAlso Not String.IsNullOrEmpty(propertyValue.ToString) Then 
      Return Nothing 
     End If 

     If Not IsNothing(propertyValue) Then 
      Return Nothing 
     End If 
    Next 

    Return New ValidationResult(FormatErrorMessage(validationContext.DisplayName)) 
End Function 

Public Function GetClientValidationRules(metadata As ModelMetadata, context As ControllerContext) As IEnumerable(Of ModelClientValidationRule) Implements IClientValidatable.GetClientValidationRules 
    Dim result = New List(Of ModelClientValidationRule) 
    Dim rule As New ModelClientValidationRule 
    rule.ErrorMessage = ErrorMessage 
    rule.ValidationType = "atleastonerequired" 

    rule.ValidationParameters("properties") = String.Join(",", _properties) 

    result.Add(rule) 

    Return result 
End Function 
End Class 

型号:

<AtLeastOneRequired({"FieldA", "FieldB", "FieldC"}, ErrorMessage:="Testing")> _ 
Public Property FieldA As String 
Public Property FieldB As String 
Public Property FieldC As String 

查看:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
jQuery.validator.unobtrusive.adapters.add(
    'atleastonerequired', ['properties'], function (options) { 
     options.rules['atleastonerequired'] = options.params; 
     options.messages['atleastonerequired'] = options.message; 
    } 
); 

jQuery.validator.addMethod('atleastonerequired', function (value, element, params) { 
    var properties = params.properties.split(','); 
    var values = $.map(properties, function (property, index) { 
     var val = $('#' + property).val(); 
     return val != '' ? val : null; 
    }); 
    return values.length > 0; 
}, ''); 


@Using Html.BeginForm("Results", "List") 
@Html.ValidationSummary(False) 
    @<div> 
     @Html.LabelFor(Function(model) model.FieldA) 
     @Html.EditorFor(Function(model) model.FieldA) 
    </div> 
    @<div> 
     @Html.LabelFor(Function(model) model.FieldB) 
     @Html.EditorFor(Function(model) model.FieldB) 
    </div> 
    @<div> 
     @Html.LabelFor(Function(model) model.FieldC) 
     @Html.EditorFor(Function(model) model.FieldC) 
    </div> 
    @<p> 
     <input type="submit" value="Search" /> 
    </p> 
End Using 

上面的代码实际工作,但我想我的简化代码的演示,这就是错误存在其中。学过的知识。

实际查看代码:

@<div class="ui-widget"> 
    @Html.LabelFor(Function(model) model.CategoryID) 
    <input class="text-box single-line" id="Category" name="Category" type="text" value="" /> 
</div> 
@<div class="ui-widget"> 
    @Html.LabelFor(Function(model) model.Manufacturer) 
    @Html.EditorFor(Function(model) model.Manufacturer) 
</div> 
@<div> 
    @Html.LabelFor(Function(model) model.aModel) 
    @Html.EditorFor(Function(model) model.aModel) 
</div> 

实际型号:

<Display(Name:="Category")> _ 
<AtLeastOneRequired({"CategoryID", "Manufacturer", "aModel"}, ErrorMessage:="Testing")> _ 
Public Property CategoryID As String 
Public Property Manufacturer As String 
<Display(Name:="Model")> _ 
Public Property aModel As String 

我最早是在搞乱jQuery Autocomplete和手动设置文本框,而不是使用HTML Helpers的。然后我将自定义属性分配给我的CategoryID属性。当我提出我的AtLeastOneRequried属性像ManufacturerModel另一个属性,它的工作。

请记住使用HTML Helper将您的自定义属性绑定到属性,否则它不会在源代码中正确呈现。