2016-02-29 50 views
0

我使用共享庫中的某些類作爲模型類。這就是爲什麼我不能改變它(添加一些屬性或其他任何東西)。但是我需要在我的頁面上添加驗證,我將這個類用作@model。 當然,我可以通過js驗證模型,但是我不知道是否有任何方法通過標準微軟mvc方法在Razor視圖中添加驗證規則? 我的意思是類似的東西如何設置Razor中的驗證規則而不是模型類

@Html.EditorFor(model => model.Title) 
@Html.ValidationMessageFor(model => (THERE IS MY VALIDATION EXPRESSION), "*", new { @class = "text-danger" }) 
+0

然後使用視圖模型,將驗證屬性應用於其屬性並將數據模型映射到它。爲了使用數據模型獲得客戶端驗證,您需要手動添加所有適當的'data-val- *'屬性,然後在提交表單時再次手動檢查控制器中的所有內容。 –

+1

這不會直接回答你的問題,但它提供了一個替代方案。有一個名爲Fluent Validation的項目,它允許您爲模型外的模型創建驗證規則。 https://github.com/JeremySkinner/FluentValidation – AndyJ

+0

AndyJ,謝謝你我會嘗試 – Kate

回答

2

開箱即用的ASP.NET MVC不提供內剃刀驗證模型的能力。不幸的是,這是使用屬性進行模型驗證的問題之一。

從這裏,你必須提供給您兩種選擇:

  1. 創建一箇中介類,然後映射回組件中的模型。
  2. 使用像FluentValidation這樣的驗證庫,允許您創建驗證規則,而無需通過靈活且可擴展的流暢API訪問模型。例如:

public class CustomerValidator: AbstractValidator<Customer> { 

    public CustomerValidator() { 
     RuleFor(customer => customer.Surname).NotEmpty(); 
     RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name"); 
     RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount); 
     RuleFor(customer => customer.Address).Length(20, 250); 
     RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode"); 
    } 

    private bool BeAValidPostcode(string postcode) { 
     // custom postcode validating logic goes here 
    } 
} 

然後你驗證你的模型像這樣:

var validator = new YourModelValidator(); 
ValidationResult results = validator.Validate(yourModel); 

就個人而言,我會選擇第二種方法。 Fluent Validation是一個夢幻般的庫,它不需要很長的時間就可以實現,並且比ASP.NET的當前實現更好地驗證模型(在我看來 - 儘管這對ASP.NET人來說毫無意義,但這正是使OSS很棒)。

0

你不能做到這一點在剃刀,但它是可能的,如果你的共享庫類是局部的,那麼你可以做到這一點

using System.ComponentModel.DataAnnotations; 

[MetadataType(typeof(EmployeeSharedValidation))] 
public partial class EmployeeShared 
{ 
    private class EmployeeSharedValidation 
    { 
    [Required] 
    public string Name; 
    } 
} 

這是驗證attribites是如何應用其上基本上是共享類幾年的EntityFramework類以前它不被認爲是一種好的做法。 正如其中一個評論中提到的那樣,您應該使用視圖模型,因爲該字段將始終對其使用的任何頁面進行驗證。例如上面代碼中的名稱字段對於使用EmployeeShared類的任何頁面都是強制性的,您不能輕易更改它。

相關問題