2011-08-18 20 views
13

我開始用實體框架弄溼我想知道是否有方法讓我檢查模型狀態而不發生模型綁定。我可以在沒有模型綁定的情況下檢查模型狀態嗎?

說我主要是從代碼創建一個用戶,有沒有一種方法可以讓我在更新之前根據預定義的數據註釋檢查它是否有效?

public ActionResult Index() 
    { 
     User u = new User(); 
     u.Username = "test"; 
     u.Password = "test"; 
     u.Email = "test"; 

     DefaultContext db = new DefaultContext();    

     if (ModelState.IsValid) 
     { 
      db.Users.Add(u); 
      db.SaveChanges(); 
      Response.Write(u.Id); 
     } 
     else 
      // model is not valid 

     return View(); 
    } 

上面的代碼不起作用,因爲沒有綁定發生。或者,也許我對這個過程感到困惑。

謝謝。

回答

17

ModelState將不可用,因爲它由模型聯編程序設置。 ModelBinder沒有綁定模型,所以它沒有運行驗證,因此ModelState將是空的。

但是,這不會阻止您使用屬性並執行驗證。

假設您正在使用DataAnnotation屬性,則可以在沒有模型綁定的情況下運行驗證。

鑑於這種類:

public class Widget 
{ 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public decimal Price { get; set; } 
} 

你可以這樣做:

 var widget = new Widget 
         { 
          Id = 12, 
          Price = 15.57M 
         }; 

     var context = new ValidationContext(widget, null, null); 
     var results = new List<ValidationResult>(); 
     if(Validator.TryValidateObject(widget, context, results, true)) 
     { 
      //Validation Successful 
     } 
     else 
     { 
      //Validation Failed 
     } 

的名稱屬性未設置和TryValidateObject()會失敗。結果收集將會發生實際的錯誤。

+1

我學習,每次我來這裏新的東西。我不知道ValidateModel()函數 - 如果您使用ASP.Net MVC,Jayantha的答案也是正確的,而且更容易。我給出的答案將在控制器的背景下工作。 –

+0

上述方法在驗證模型時沒有提交表單時效果很好,在這種情況下'TryValidateModel'失敗:'驗證模型時,如果至少有一個表單輸入綁定到模型,所有屬性的驗證器都會運行屬性.'從這裏:https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryvalidatemodel(v=vs.118).aspx – Alex

10

可以使用TryValidateModelValidateModel

User u = new User(); 
    u.Username = "test"; 
    u.Password = "test"; 
    u.Email = "test"; 


    if (TryValidateModel(u)) 
    { 

    }else{ 

    } 
相關問題