加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET MVC2模型验证失败,非美国日期格式

发布时间:2020-12-16 03:51:19 所属栏目:asp.Net 来源:网络整理
导读:我有一个小型的MVC2应用程序,它以两种文化显示:en-US和es-MX.一部分包含用于预先填充模型中当前日期的日期的用户输入. 使用en-US时,日期字段显示为MM / dd / yyyy,可以使用相同的格式更改,而不会导致任何验证错误. 使用es-MX时,日期字段显示为dd / MM / yyy
我有一个小型的MVC2应用程序,它以两种文化显示:en-US和es-MX.一部分包含用于预先填充模型中当前日期的日期的用户输入.

使用en-US时,日期字段显示为MM / dd / yyyy,可以使用相同的格式更改,而不会导致任何验证错误.

使用es-MX时,日期字段显示为dd / MM / yyyy,但是当以此格式编辑日期时,服务器端验证将失败并显示以下消息:

The value ’17/05/1991′ is not valid for The Date.

关于该消息的第一件事就是它没有本地化.消息本身(我认为我无法控制)和字段的显示名称(我可以控制并在我的代码中本地化).应该以本地化格式显示.

我已经尝试单步执行代码以查看验证失败的确切位置,但它似乎发生在我看不到的一些已编译的MVC或DataAnnotations代码中.

应用程序详细信息:IIS6,ASP.NET 3.5(C#),MVC 2 RTM

样本型号代码:

public class TestVieModel{
    [LocalizedDisplayNameDisplayName("TheDateDisplayName",NameResourceType=typeof(Resources.Model.TestViewModel))]
    [Required(ErrorMessageResourceName="TheDateValidationMessageRequired",ErrorMessageResourceType=typeof(Resources.Model.TestViewModel))]
    [DataType(DataType.Date)]
    public DateTime TheDate { get; set; }
}

样本控制器操作代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(TestViewModel model) {
    if(ModelState.IsValid) {  // <--- Always is false when using es-MX and a date foramtted as dd/MM/yyyy.
        // Do other stuff
        return this.View("Complete",model);
    }

    // Validation failed,redisplay the form.
    return this.View("Enter",model);
}

示例查看代码:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<HispanicSweeps.Web.Model.LosMets.EnterViewModel>" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Test</title>
    </head>
    <body>
        <% using (Html.BeginForm()) {%>
            <%= Html.ValidationSummary(true) %>

            <fieldset>
                <legend>Fields</legend>
                <div class="editor-label">
                    <%= Html.LabelFor(model => model.TheDate) %>
                </div>
                <div class="editor-field">
                    <%= Html.EditorFor(model => model.TheDate) %>
                    <%= Html.ValidationMessageFor(model => model.TheDate) %>
                </div>

                <p><input type="submit" value="Save" /></p>
            </fieldset>

        <% } %>
    </body>
</html>

解决方法

以下是我在案例中解决问题的方法.我手动验证控制器中的日期并重置该属性的ModelState:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Save(TestViewModel model) {

    var tempDate = new DateTime();
    var culture = CultureInfo.CurrentUICulture;

    if(DateTime.TryParse(Request.Form["TheDate"],culture,DateTimeStyles.None,out tempDate)) {
        model.DateOfBirth = tempDate;
        ModelState.Remove("TheDate");
        }

    if(ModelState.IsValid) {  // <--- Now valid
        // Do other stuff
        return this.View("Complete",model);
        }

    // Validation failed,model);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读