2013-05-03 89 views
2

我很難用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 

回答

1

上面的代碼實際工作,但我想我的簡化代碼的演示,這就是錯誤存在其中。學過的知識。

實際查看代碼:

@<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將您的自定義屬性綁定到屬性,否則它不會在源代碼中正確呈現。

相關問題