2012-05-28 58 views
0

在ASP.NET MVC應用程序,我已經定義爲模型如下:爲什麼當我的字符串太長時,MVC會在我的模型上調用set方法?

public class TestModel 
{ 
    private string _firstName; 

    [DisplayName("First Name")] 
    [StringLength(20)] 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (!string.IsNullOrEmpty(value)) 
       if (value.Length > 20) 
        throw new Exception("Too long"); 

      _firstName = value; 
     } 
    } 
} 

在我的控制器更新動作的方法,我有以下代碼:

[HttpPost] 
public ActionResult Update() 
{ 
    var tm = new TestModel(); 
    if (ModelState.IsValid) 
    { 
     if (TryUpdateModel(tm)) 
     { 
      // Save to the DB 
     } 
    } 

    return View("Test", tm); 
} 

的問題是,當我在我的視圖中的文本框中輸入了一個超過20個字符的值我期望MVC不會嘗試在我的模型上設置屬性(然後拋出一個異常,因爲它太長而無法放入數據庫列)。我原以爲它會在實際嘗試設置屬性之前被ModelState.IsValid測試阻止。

請注意,我在這裏模擬一個實際的ORM - LLBLGenPro - 這是它爲其具有長度的數據庫列生成的屬性所做的 - 它會在嘗試設置太長的值時引發異常。

除了修改LLBLGen的模板外,我應該如何解決這個問題?

這是ASP.NET MVC的正常行爲嗎?

回答

0

你的代碼,如提供,那並不從視圖接收模型實例,並且要創建在我們的代碼的類的實例,所以它不可能告訴
驗證碼:

var tm = new TestModel(); 

創建Testmodel的實例,但它不會綁定到從發佈表單收到的值。你的行爲應該基本看起來像

public ActionResult Update(TestModel model) 

這是模型mvc將嘗試驗證的實例。
也許你應該發佈你的整個代碼(包括視圖)來查看是否有其他東西丟失,但是到目前爲止你提供的代碼中,你永遠不會在存儲庫中更新表單值,也不會有異常拋出,因爲FirstName將保持爲空。

相關問題