2016-03-26 126 views
1

我有模型自定義驗證在MVC模式

public class GroupedIssueData 
{ 

    [Range(0, double.MaxValue, ErrorMessage = "Please enter valid number")] 
    public double IssueQty { get; set; } 

    public double ReqQty { get; set; } 

    public bool isSavings { get; set; } 
} 

這包含兩個屬性爲IssueQty和IsSaving,如果IsSaving被選中,那麼IssueQty可以爲空,如果IssueQty不爲空,然後IsSaving可留空。我怎樣才能驗證此

我的看法是

<td> 
    @Html.DisplayFor(m => m.MaterialData[i].ReqQty) 
    @Html.HiddenFor(m => m.MaterialData[i].ReqQty) 
</td> 
<td>@Html.TextBoxFor(m => m.MaterialData[i].IssueQty, new { style = "width:70px" })@Html.ValidationMessageFor(m => m.MaterialData[i].IssueQty)</td> 
<td class="text-center">@Html.CheckBoxFor(m => m.MaterialData[i].isSavings)</td> 

我的控制器是

public async Task<ActionResult> GetWorkOrderMaterialDetails(IssueEntryModel m) 
{ 
    if (!ModelState.IsValid) 
    { 
     // redirect 
    } 
    var model = new IssueEntryModel(); 
} 

我怎樣才能重定向到如果模型無效。我是否需要重定向到相同的控制器?我想保留輸入的數據。

我的看法是

+0

使用[萬無一失(http://foolproof.codeplex.com /)''[RequiredIfTrue]''或類似的驗證屬性(或自己寫的) –

回答

0

試試這個

`

[Required] 
     [Range(18, 100, ErrorMessage = "Please enter an age between 18 and 50")] 
     public int Age { get; set; } 


    [Required]   
    [StringLength(10)] 
    public int Mobile { get; set; }    

    [Range(typeof(decimal), "0.00", "15000.00")] 
    public decimal Total { get; set; } ` 

if (ModelState.IsValid) 
     { 
      // 
     } 
     return View(model); 

Validation to the Model

Custom Validation Data Annotation Attribute

0

您可以自定義驗證例如這裏RequiredIfOtherFieldIsNullAttribute等記載:

How to validate one field related to another's value in ASP .NET MVC 3

public class RequiredIfOtherFieldIsNullAttribute : ValidationAttribute,  IClientValidatable 
{ 
private readonly string _otherProperty; 
public RequiredIfOtherFieldIsNullAttribute(string otherProperty) 
{ 
    _otherProperty = otherProperty; 
} 

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    var property = validationContext.ObjectType.GetProperty(_otherProperty); 
    if (property == null) 
    { 
     return new ValidationResult(string.Format(
      CultureInfo.CurrentCulture, 
      "Unknown property {0}", 
      new[] { _otherProperty } 
     )); 
    } 
    var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null); 

    if (otherPropertyValue == null || otherPropertyValue as string == string.Empty) 
    { 
     if (value == null || value as string == string.Empty) 
     { 
      return new ValidationResult(string.Format(
       CultureInfo.CurrentCulture, 
       FormatErrorMessage(validationContext.DisplayName), 
       new[] { _otherProperty } 
      )); 
     } 
    } 

    return null; 
} 

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
{ 
    var rule = new ModelClientValidationRule 
    { 
     ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), 
     ValidationType = "requiredif", 
    }; 
    rule.ValidationParameters.Add("other", _otherProperty); 
    yield return rule; 
} 

}

而且使用這樣的:

[RequiredIfOtherFieldIsNull("IsSavings")] 
public double IssueQty { get; set; } 
[RequiredIfOtherFieldIsNull("IssueQty")] 
public bool IsSavings { get; set; } 
0

使用IValidatableObject

但是您的條件:如果IsSaving檢查那麼是sueQty可以爲空,如果IssueQty不爲空,則IsSaving可以留空是有點混亂,但是這可能暗示你反正

public class GroupedIssueData : IValidatableObject 
{ 
    [Range(0, double.MaxValue, ErrorMessage = "Please enter valid number")] 
    public double IssueQty { get; set; } 

    public double ReqQty { get; set; } 

    public bool isSavings { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!isSavings && IssueQty == 0) 
     { 
      yield return new ValidationResult("Error Message"); 
     } 
    } 
} 

public async Task<ActionResult> GetWorkOrderMaterialDetails(IssueEntryModel m) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(m); 
     // redirect 
    } 

} 
+0

謝謝,如何重定向顯示驗證結果而不丟失數據。我是否需要通過相同的控制器或不同的控制器返回? – Techonthenet

+0

@Techonthenet請檢查我的編輯 – brykneval