如何在验证摘要中显示错误

本文关键字:显示 错误 验证 | 更新日期: 2023-09-27 17:56:08

我是MVC的新手,我试图弄清楚为什么没有显示验证摘要。 代码如下:

视图:

<% using(var form = Html.BeginForm("Create", "User"))
{%>
    <table>
        <thead>
            <th>Create User</th>
            <th><%= Html.ValidationSummary(false) %></th>
        </thead>
        <tbody>
            <tr>
                <td><%= Html.LabelFor(model => model.Creating.Username) %>:</td>
                <td><%= Html.TextBoxFor(model => model.Creating.Username) %></td>
            </tr>
            <tr>
                <td><%= Html.LabelFor(model => model.Creating.Firstname) %>:</td>
                <td><%= Html.TextBoxFor(model => model.Creating.Firstname)%></td>
            </tr>
            <tr>
                <td><%= Html.LabelFor(model => model.Creating.Lastname) %></td>
                <td><%= Html.TextBoxFor(model => model.Creating.Lastname) %></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="Create" />
                </td>
            </tr>
        </tbody>
    </table>
<%}%>

相关控制器方法:

[HttpPost]
public ActionResult Create(User creating)
{
    var response = _service.Save(creating);
    if (response.Success)
        return RedirectToAction("Index");
    response.Errors.CopyToModelState(this.ModelState);
    return RedirectToAction("Index");
}

业务逻辑方法:

public Response Save(User user)
{
    //Place Validation logic here
    //Check username is between 3-30 characters and make sure the username is unique
    //return response if username fails business rules
    bool isDataInvalid = false;
    List<ValidationError> errorList = new List<ValidationError>();
    if ((user.Username.Length < 3) || user.Username.Length > 30)
    {
        ValidationError invalidUsernameLengthError = new ValidationError();
        invalidUsernameLengthError.Property = "Creating.Username";
        invalidUsernameLengthError.ErrorMessage = "must be between 3 and 30 characters long";
        errorList.Add(invalidUsernameLengthError);
        isDataInvalid = true;
    }
    if (isDataInvalid)
    {
        return new Response()
        {
            Success = false,
            Errors = errorList
        };   
    }
    _repository.Save(user);
    return new Response()
    {
        Success = true
    };
}

帮助程序方法:

public static void CopyToModelState(this List<ValidationError> errors,  ModelStateDictionary modelState)
{
    foreach (var error in errors)
    {
        modelState.AddModelError(error.Property, error.ErrorMessage);
    }
}

逻辑会做它应该做的事情,但什么都没有显示。我已经检查了获得输出的 HTML,验证只是没有被编写。我尝试将模型的属性分配给 modelState 并直接在相关字段上显示验证,但这也不起作用。有什么想法吗?


啊! 执行重定向到操作会导致新请求,因此错误数据丢失。此外,我正在使用不同的控制器,因此我需要显式调用原始视图(Index.aspx)。 此外,我的索引.aspx期望的模型实际上不是用户对象,它是一个不同的列表对象,所以我需要做:

        var users = _service.FindAll();
        return View("Index", new UserListModel() { Users = users });

而不是重定向到操作。 这显然是验证错误的标准模式 - 为了成功(无错误),您使用 RedirectToAction,但对于错误,您需要返回正确的视图。


好的,谢谢马蒂托莫 - 这真的很有用。 不过我仍然遇到问题。 我现在为控制器提供了这个 - 类似于您的建议,但仍然没有显示错误消息。 我尝试了数据注释,但无法使其工作(我使用的是 MVC2),并且一直在尝试我能想到的一切来修复现有代码。

    [HttpPost]
    public ActionResult Create(User creating)
    {
        var response = _service.Save(creating);
        if (response.Success)
            return RedirectToAction("Index");
        foreach (var error in response.Errors)
        {
            ModelState.AddModelError(error.Property, error.ErrorMessage);
        }
        return RedirectToAction("Index");
    }

还有什么想法吗? 我很感激你的建议!

如何在验证摘要中显示错误

我认为您正在按值传递ModelState变量,因此您在该函数中所做的更改实际上并未保留。尝试重现函数的功能,但要重现实际的ModelState对象,如下所示:

[HttpPost]
public ActionResult Create(User creating)
{
    var response = _service.Save(creating);
    if (response.Success)
        return RedirectToAction("Index");
    foreach (var error in response.Errors)
    {
        ModelState.AddModelError(error.Property, error.ErrorMessage);
    }
    return View(creating);
}

您还应该查看 MVC 数据注释,像您这样的验证可以通过将这两个属性放在 Username 属性上来简单地替换:

[MinLength(3), MaxLength(30)]
public string UserName { get; set; }

或者只有一个属性使用 StringLength(谢谢@SimonWhitehead):

[StringLength(30, MinimumLength = 3)]

数据注释:此处