2010-05-08 71 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> 
    <%} %>