2010-05-08 75 views
1

我在構建的ASP.NET MVC網站上有一個簡單的表單。提交此表單,然後驗證表單字段不爲空,空或格式不正確。ASP.NET MVC中的表單提交屬性驗證錯誤

但是,當我使用ModelState.AddModelError()指示來自我的控制器代碼的驗證錯誤時,我的視圖重新呈現時,I 會出現錯誤。在Visual Studio中,我得到了下面的行被突出顯示爲錯誤的位置:

<%=Html.TextBox("Email")%> 

的錯誤是:

NullReferenceException was unhandled by user code - object reference not set to an instance of an object.

我該文本框完整的代碼如下:

<p> 
<label for="Email">Your Email:</label> 
<%=Html.TextBox("Email")%> 
<%=Html.ValidationMessage("Email", "*") %> 
</p> 

以下是我正在做的是驗證在我的控制器:

 try 
     { 
      System.Net.Mail.MailAddress address = new System.Net.Mail.MailAddress(email); 
     } 
     catch 
     { 
      ModelState.AddModelError("Email", "Should not be empty or invalid"); 
     } 

return View(); 

注意:這適用於我所有的領域,不只是我的電子郵件字段,只要他們是無效的

回答

1

這是一個可怕的錯誤/功能(在任何調用)在ASP.NET MVC,你可以通過調用SetModelValue這樣修復幫手:

ModelState.AddModelError("Email", "Should not be empty or invalid"); 
ModelState.SetModelValue("Email", new ValueProviderResult("raw value", "attempted value", CultureInfo.InvariantCulture)); 

順便問一下有沒有你會寫所有任何理由此代碼時,您可以簡單地註釋您的視圖模型:

public class SomeViewModel 
{ 
    [RegularExpression("Some bulletproof regex you could google to validate email address", ErrorMessage = "Should not be empty or invalid")] 
    public string Email { get; set; } 
} 

並保留數據活頁夾做繁重工作。

+0

因此,對於第一個代碼示例:你必須有兩條線,對不對?換句話說,我首先調用AddModelError,然後調用SetModelValue?另外,什麼是原始價值和企圖價值?謝謝。 – 2010-05-08 22:15:25

+0

是的,你需要兩條線。 RawValue指向具有用於更新的屬性的對象。 AttemptedValue存儲用戶實際輸入的內容。我相信你可能會留下空白。 – 2010-05-08 22:19:11

+0

您能舉一個RawValue的例子,比如email屬性嗎?我有點困惑。 – 2010-05-08 22:41:58

0

我無法複製。

行動

[HttpPost] 
public ActionResult Index(string email) 
{ 
    if (string.IsNullOrEmpty(email)) 
    { 
     ModelState.AddModelError("Email", "Should not be empty or invalid"); 
    } 
    return View(); 
} 

查看

<%using (Html.BeginForm() { %> 
    <p> 
     <label for="Email"> 
      Your Email:</label> 
     <%=Html.TextBox("Email")%> 
     <%=Html.ValidationMessage("Email", "*") %> 
     <input type="submit" /> 
    </p> 
    <%} %>