gpt4 book ai didi

c# - ASP.NET MVC : Validation messages set in TryUpdateModel not showning ValidationSummary

转载 作者:太空宇宙 更新时间:2023-11-03 11:53:33 25 4
gpt4 key购买 nike

我一直在尝试遵循网络上的验证教程和示例,例如 David Hayden's Blog和官方ASP.Net MVC Tutorials ,但我无法获得以下代码来显示实际的验证错误。如果我有一个看起来像这样的 View :

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

<%-- ... content stuff ... --%>

<%= Html.ValidationSummary("Edit was unsuccessful. Correct errors and retry.") %>
<% using (Html.BeginForm()) {%>

<%-- ... "Parent" editor form stuff... --%>

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

<%-- etc... --%>

对于如下所示的模型类:

public class Parent
{
public String FirstName { get; set; }
public String LastName { get; set; }
public int Age { get; set; }
public int Id { get; set; }
}

每当我输入无效年龄(因为年龄被声明为整数),例如“xxx”(非整数), View 确实正确显示消息“编辑不成功。正确错误并重试”,并突出显示年龄文本框并在其旁边放置一个红色星号,以指示错误。但是,ValidationSummary 不会显示任何错误消息列表。当我自己进行验证时(例如:下面的 LastName),消息会正确显示,但 TryUpdateModel 的内置验证似乎不会在字段具有非法值时显示消息。

这是在我的 Controller 代码中调用的操作:

    [AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditParent(int id, FormCollection collection)
{
// Get an updated version of the Parent from the repository:
Parent currentParent = theParentService.Read(id);

// Exclude database "Id" from the update:
TryUpdateModel(currentParent, null, null, new string[]{"Id"});
if (String.IsNullOrEmpty(currentParent.LastName))
ModelState.AddModelError("LastName", "Last name can't be empty.");
if (!ModelState.IsValid)
return View(currentParent);

theParentService.Update(currentParent);
return View(currentParent);
}

我错过了什么?

最佳答案

我下载并查看了 ASP.NET MVC v1.0 source code来自 Microsoft,并发现,无论是意外还是设计,都没有办法做我想做的事,至少在默认情况下是这样。显然,在调用 UpdateModel 或 TryUpdateModel 期间,如果整数验证(例如)失败,则不会在与错误值的 ModelState 关联的 ModelError 中显式设置 ErrorMessage,而是设置 Exception 属性。根据MVC ValidationExtensions中的代码,以下代码用于获取错误文本:

string errorText = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, null /* modelState */);

注意传递了 modelState 的 null 参数。 GetUserErrorMEssageOrDefault 方法然后像这样开始:

private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState) {
if (!String.IsNullOrEmpty(error.ErrorMessage)) {
return error.ErrorMessage;
}
if (modelState == null) {
return null;
}

// Remaining code to fetch displayed string value...
}

因此,如果 ModelError.ErrorMessage 属性为空(我在尝试将非整数值设置为声明的 int 时验证了它是空的),MVC 继续检查我们已经发现的 ModelState 为空,因此对于任何 Exception ModelError 都会返回 null。因此,在这一点上,我对这个问题的 2 个最佳解决方法是:

  1. 创建自定义验证扩展,在未设置 ErrorMessage 但设置了 Exception 时正确返回适当的消息。
  2. 创建一个预处理函数,如果 ModelState.IsValid 返回 false,该函数将在 Controller 中调用。预处理函数将在 ModelState 中查找未设置 ErrorMessage 但设置了 Exception 的值,然后使用 ModelState.Value.AttemptedValue 派生适当的消息。

还有其他想法吗?

关于c# - ASP.NET MVC : Validation messages set in TryUpdateModel not showning ValidationSummary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1362435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com