【问题标题】:Error with Property Validation in Form Submission in ASP.NET MVCASP.NET MVC 中的表单提交中的属性验证错误
【发布时间】:2010-05-08 21:51:20
【问题描述】:

我正在构建的 ASP.NET MVC 站点上有一个简单的表单。此表单已提交,然后我验证表单字段不为空、为空或格式不正确。

但是,当我使用 ModelState.AddModelError() 指示控制器代码中的验证错误时,我在重新渲染视图时收到错误。在 Visual Studio 中,我发现以下行突出显示为错误的位置:

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

错误如下:

NullReferenceException 未被用户代码处理 - 对象引用未设置为对象的实例。

我对该文本框的完整代码如下:

<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();

注意:这适用于我的所有字段,而不仅仅是我的电子邮件字段,只要它们无效

【问题讨论】:

    标签: c# asp.net asp.net-mvc validation modelstate


    【解决方案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; }
    }
    

    让数据绑定器完成繁重的工作。

    【讨论】:

    • 所以,对于第一个代码示例:你必须有两行,对吧?也就是说,我先调用 AddModelError,然后调用 SetModelValue?另外,什么是原始价值和尝试价值?谢谢。
    • 是的,你需要两条线。 RawValue 指向具有用于更新的属性的对象。 AttemptedValue 存储用户实际输入的内容。我相信您可以将它们留空。
    • 您能否举一个 RawValue 的示例,例如电子邮件属性?我有点困惑。
    【解决方案2】:

    我无法复制。

    动作

    [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>
        <%} %>
    

    【讨论】:

      猜你喜欢
      • 2017-02-26
      • 1970-01-01
      • 2011-07-09
      • 2011-03-26
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      相关资源
      最近更新 更多