gpt4 book ai didi

asp.net-mvc-3 - ASP.Net MVC 3 - 编辑器模板的客户端不显眼验证

转载 作者:行者123 更新时间:2023-12-03 18:12:00 25 4
gpt4 key购买 nike

我是 ASP.Net MVC 3 的新手,在尝试为我为以自定义方式显示日期而创建的编辑器模板实现客户端不显眼的验证时遇到了一些问题。

用户界面
我需要以三个 texbox UI 格式显示日期为

enter image description here

我已经建立了一个 EditorTemplate 用于将日期显示为三个部分

@model DateTime?

<table class="datetime">
<tr>
<td>@Html.TextBox("Day", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
<td class="separator">/</td>
<td>@Html.TextBox("Month", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
<td class="separator">/</td>
<td>@Html.TextBox("Year", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
</tr>
<tr>
<td class="label">dd</td>
<td/>
<td class="label">mm</td>
<td/>
<td class="label">yyyy</td>
</tr>
</table>

型号

我必须在此结构中将作为模型子对象中的属性的出生日期字段绑定(bind)到此属性
MyModel
--> MySubModel
--> DateOfBirth

public class MySubModel
{
...

[DataType(DataType.Date)]
[Display(Name = "Date of birth")]
[DateTimeClientValidation()]
public DateTime DateofBirth { get; set; }

...
}

客户端验证

我已经提出了一个自定义验证属性,该属性将 IClientValidatable 实现为
public class DateTimeClientValidationAttribute : ValidationAttribute, IClientValidatable
{
...

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
List<ModelClientValidationRule> clientRules = new List<ModelClientValidationRule>();

//Combined date should be valid
ModelClientValidationRule validDateRule = new ModelClientValidationRule
{
ErrorMessage = "Please enter a valid date.",
ValidationType = "validdate"
};
validDateRule.ValidationParameters.Add("dayelement", metadata.PropertyName + ".Day");
validDateRule.ValidationParameters.Add("monthelement", metadata.PropertyName + ".Month");
validDateRule.ValidationParameters.Add("yearelement", metadata.PropertyName + ".Year");
clientRules.Add(validDateRule);

return clientRules;
}
...
}

我试图在这里向客户端验证元素发出日、月和年文本框的元素名称,以便稍后我将编写客户端 jquery 验证方法和适配器,它将使用这些元素并在客户端进行验证。

查看

现在,要使用这个编辑器模板,我在 View 中输入了以下几行
@model MyModel
...
<tr>
<td class="editor-label">
@Html.LabelFor(m => m.MySubModel.DateofBirth)
</td>
<td class="editor-field">
@Html.EditorFor(m => m.MySubModel.DateofBirth)
@Html.ValidationMessageFor(m => m.MySubModel.DateofBirth)
</td>
</tr>
...

在 View 中添加了所有相关的 jquery 验证文件作为引用

问题
  • 尽管我已经实现了 IClientValidatable,但这并没有在 html 中发出不显眼的 javascript 验证属性。
    出于测试目的,当我将相同的属性 (DateTimeClientValidation) 放在模型中未使用此编辑器模板的另一个属性上时,它会发出这些验证属性,它不会仅针对此编辑器模板发出它。我哪里错了?
  • 关于编辑器模板的验证消息跨度,是只放在 View 中还是应该直接放在编辑器模板中 (@Html.ValidationMessageFor(m => m.MySubModel.DateofBirth))
  • 在这个例子中,我在设计中是否正确,我已经放入了 DateTimeClientValidationAttribute,它实际上是我放在模型上的一个属性,但是这个组件对 UI 有一点了解(因为它试图发出 Day、Month 和 Year 元素给客户的名字),这让模型对 View 有点了解,我在这里违反了任何设计原则吗?
  • 在 DateTimeClientValidationAttribute 中,我试图向客户端发出日、月和年元素名称,以便客户端脚本可以对其进行验证。但是由于模型属性 DateofBirth 在子对象中,脚本中的实际元素名称是 MySubObject.DateOfBirth,这使得 Day 文本框名称为 MySubObject.DateofBirth.Day,如何在 GetClientValidationRules 方法中找到完全限定的模型名称,以便我可以向客户发出名称?

  • 感谢您耐心阅读所有这些内容并提供答案

    最佳答案

    经过一番努力,我使控件起作用,如果它对那里的任何人有帮助,则将其放入。

    第一点是将控制定义为

    @model DateTime?

    <table class="datetime">
    <tr>
    <td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("dd") : string.Empty)) </td>
    <td class="separator">/</td>
    <td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM") : string.Empty))</td>
    <td class="separator">/</td>
    <td>@Html.TextBox("", (Model.HasValue ? Model.Value.ToString("yyyy") : string.Empty))</td>
    </tr>
    <tr>
    <td class="label">dd</td>
    <td/>
    <td class="label">mm</td>
    <td/>
    <td class="label">yyyy</td>
    </tr>
    </table>

    确保,你给 空字符串作为名称 对于所有三个文本框,这会强制 MVC 框架生成相同的 姓名 对应于客户端所有三个文本框的 Model DateofBirth。此外,将为列表中的第一个文本框生成不显眼的 javascript 验证参数,因为它是具有模型名称的编辑控件的第一次出现。

    在客户端,任何这些文本框上的任何事件都会触发所有相关的验证事件,因为所有这 3 个文本框都具有相同的名称。

    除了需要的常规验证之外,......我们必须编写一个自定义客户端验证例程,它将所有这三个值结合起来并检查组合值是否形成有效日期。这可以在 answer 中实现。由 Jeff 给出.

    关于asp.net-mvc-3 - ASP.Net MVC 3 - 编辑器模板的客户端不显眼验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5378520/

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