ASP.Net MVC和验证消息

时间:2009-06-18 10:53:57

标签: asp.net-mvc

我正试图掌握ASP.Net MVC中的验证消息。我有以下观点

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"  Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create User</h2>

    <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

    <% using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Fields</legend>
            <p>
                Username : <%= Html.TextBox("Username") %>
            </p>
            <p>
                Forename : <%= Html.TextBox("Forename") %>
                <%= Html.ValidationMessage("Forename", "*") %>
            </p>
            <p>
                Surname : <%= Html.TextBox("Surname","") %>
                <%= Html.ValidationMessage("Surname", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
    <title><%= ViewData["ProjectTitle"] %> - Create User</title>
</asp:Content>

然后我在我的控制器中有这个post方法,如果surname字段为空,我应该显示一条错误消息,我意识到这个函数中没有其他逻辑我只是试图让我的头部验证。

  [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection formValues)
    {
        if (formValues["Surname"] == string.Empty)
            ViewData.ModelState.AddModelError("Surname", "No way");
        return View("Create");
    }

当我运行它并单击以保存用户时,Create方法运行正常并添加错误,但随后应用程序崩溃,它会突出显示创建姓氏文本框的视图中的行并显示“未设置为实例对象“。如果我在姓氏文本框中添加了一些内容并且没有添加错误,那么它运行正常。

我猜我错过了一些非常简单但可以解决问题的东西。

有什么想法吗?

由于

加文

3 个答案:

答案 0 :(得分:1)

您是否尝试删除TextBox上的第二个参数?它将在ViewData中查找空键。

以下一行

Surname : <%= Html.TextBox("Surname","") %>

需要像

Surname : <%= Html.TextBox("Surname") %>

答案 1 :(得分:0)

我想我找到了一个解决方案,将下面的setModelValue行添加到我设置错误的行上方的方法中。

            ModelState.SetModelValue("Username", new ValueProviderResult(ValueProvider["Username"].AttemptedValue, formValues["Username"], System.Globalization.CultureInfo.CurrentCulture));
            ModelState.AddModelError("Username", "Invalid Username");

如果有人能够解释为什么这样做会很好,如果不是我会接受这个答案tommorow。除非我真的需要,否则我宁愿不必为永远的领域做这件事。

答案 2 :(得分:-1)

您应该在if语句中测试Null或为空,

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(string Username, string Surname,  string Forename)
{
  if (String.IsNullOrEmpty(Surname))
  {
     ModelState.AddModelError("Surname", "No way");
  }

  return View();
}