2016-04-27 13 views
7

當我做了創建方法我結合我的對象在參數,然後我檢查是否ModelState是有效的,所以我添加到數據庫:ModelState.IsValid是做什麼的?

但是,當我需要改變某些事情之前,我添加到數據庫中(我之前改變它ModelState不能有效,所以我必須這樣做) 爲什麼模型狀態仍然無效。

這個函數檢查的是什麼?

這是我的例子:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { 
    encaissement.Montant = Convert.ToDecimal(encaissement.Montant); 
    ViewBag.montant = encaissement.Montant; 
    if (ModelState.IsValid) { 
    db.Encaissements.Add(encaissement); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "Encaissement"); 
    }; 
    ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); 
    return View(encaissement); 
} 
+0

您的模型有任何必需的屬性嗎?如果沒有輸入任何必填字段,模型狀態將無效。 –

+0

輸入了所有必需的屬性,但我的模型狀態仍然無效! – kokomoi

+0

看看我的答案,也許您的視圖綁定到不可爲空的int或datetime,並且這也會導致ModelState無效。 –

回答

11

ModelState.IsValid指示是否可以將來自請求的傳入值正確綁定到模型,以及是否有任何明確指定的驗證規則在模型綁定過程中被破壞。

在你的例子中,被綁定的模型屬於類型Encaissement。驗證規則是通過在IValidatableObjectValidate()方法中添加的屬性,邏輯和錯誤(或僅在操作方法的代碼內)在模型上指定的規則。

如果IsValid屬性將爲true,如果值能夠正確綁定到模型並且沒有驗證規則在過程中被破壞。

這裏有一個如何驗證屬性和IValidatableObject可能會在你的模型類中實現的示例:

public class Encaissement : IValidatableObject 
{ 
    // A required attribute, validates that this value was submitted  
    [Required(ErrorMessage = "The Encaissment ID must be submitted")] 
    public int EncaissementID { get; set; } 

    public DateTime? DateEncaissement { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     var results = new List<ValidationResult>(); 

     // Validate the DateEncaissment 
     if (!this.DateEncaissement.HasValue) 
     { 
      results.Add(new ValidationResult("The DateEncaissement must be set", new string[] { "DateEncaissement" }); 
     } 

     return results; 
    } 
} 

下面是如何相同的驗證規則可能你的榜樣的作用方法中應用的例子:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "EncaissementID,libelle,DateEncaissement,Montant,ProjetID,Description")] Encaissement encaissement) { 

    // Perform validation 
    if (!encaissement.DateEncaissement.HasValue) 
    { 
     this.ModelState.AddModelError("DateEncaissement", "The DateEncaissement must be set"); 
    } 

    encaissement.Montant = Convert.ToDecimal(encaissement.Montant); 

    ViewBag.montant = encaissement.Montant; 

    if (ModelState.IsValid) { 

    db.Encaissements.Add(encaissement); 
    db.SaveChanges(); 
    return RedirectToAction("Index", "Encaissement"); 

    }; 

    ViewBag.ProjetID = new SelectList(db.Projets, "ProjetId", "nomP"); 

    return View(encaissement); 
} 

值得注意的是,模型屬性的值類型也將被驗證。例如,您不能將字符串值分配給int屬性。如果你這樣做,它不會被綁定,錯誤也會被添加到你的ModelState

在您的示例中,EncaissementID值的發佈值不能爲"Hello",這會導致添加模型驗證錯誤,並且IsValid將爲false。

由於上述任何一個原因(也可能更多),模型狀態的IsValid布爾值將是false

+0

謝謝,但它仍然是蓬鬆的!當我在我的模型中更改somethig例如我需要將一個字符串轉換爲一個十進制,然後我添加到數據庫.. modelstate.isvalid檢查傳遞參數中的模型,而不是我的更新後的狀態? – kokomoi

7

ModelState.IsValid基本上都會告訴你,如果有一個與你的數據發送到服務器的基礎上,添加到您的模型的屬性數據註解的任何問題。

例如,如果您有[Required(ErrorMessage = "Please fill")],並且在將表單發佈到服務器時該屬性爲空,則ModelState將無效。

ModelBinder還會爲您檢查一些基本的東西。例如,如果您有BirthDate日期選擇器,並且此選取器綁定的屬性不是可空的DateTime類型,那麼如果您將日期保留爲空,那麼您的ModelState也將無效。

Herehere是一些有用的職位來閱讀。

2

您可以在ModelState及其用途here上找到精彩的文章。

具體而言,IsValid屬性是檢查ModelState.Errors中是否存在任何字段驗證錯誤的快速方法。如果您不確定是什麼導致您的模型在POST到您的控制器方法時失效,那麼您可以檢查ModelState.Errors屬性,該屬性至少會產生一個表單驗證錯誤。

+0

ModelState.Errors不存在!有:SerializeErrors和AddModelError全部是 – kokomoi

+2

它是'ModelState [「Property」] .Errors'。換句話說,'ModelState'是一種字典。您發佈的模型上的任何屬性都將獲得一個鍵。您必須在適當的屬性上索引字典,才能查看該屬性的錯誤。如果您只是想弄清楚什麼是錯誤,請在您的發佈操作中調試並放置一個斷點。然後,檢查'ModelState',按鍵,查看每個'Errors'集合。 –