【问题标题】:Get Validation Attributes in an MVC3 Editor Template在 MVC3 编辑器模板中获取验证属性
【发布时间】:2013-07-29 16:40:14
【问题描述】:

我正在编写一个编辑器模板,用于输入由三个字段组成的日期和时间。

  • 带有 jQ​​uery UI 日期选择器的文本框。
  • 用于输入时间的文本框。
  • 通过 javascript 使用完整的日期和时间字符串更新的隐藏输入。

这个想法是为用户显示日期和时间的单独字段,而只有一个字段绑定到模型。每当显示的字段发生变化时,隐藏的字段都会通过 JavaScript 更新。

@model System.DateTime?
<span class="datetime-editor">
<input class="datepicker" value="@(Model.HasValue ? 
  Model.Value.Date.ToString() : string.Empty)" readonly="readonly"/>
<input class="time" value="@(Model.HasValue ? 
  Model.Value.TimeOfDay.ToString() : string.Empty)"/>
@Html.HiddenFor(d => d)</span>

用于设置日期选择器并将值复制到隐藏字段的 JavaScript。

$(".datepicker").datepicker();
$(".datetime-editor").find("input").change(function () {
    var date = $(this).parent().find(".datepicker").val();
    var time = parseTime($(this).parent().find(".time").val());
    if (date != "" && time != null) {
        $(this).siblings(".datetime-result").val(date + " " + time);
    }
    else {
        $(this).siblings(".datetime-result").val("");
    }
});

我的问题是验证属性。它们都存在于隐藏的输入标签中:

<input name="StartDateTime" id="StartDateTime" type="hidden" 
  data-val-required="Start date and time are required" data-val="true" value=""/>

我想以某种方式获取生成的data-val* 属性并将它们添加到可见输入中。通过ViewData.ModelMetaData,我可以确定该字段是否是必需的,但是我必须重新发明逻辑来创建data-val-required 属性。我想获取生成的属性。

【问题讨论】:

  • 我没有看到你的 2 个输入字段的意义。他们没有名字。它们的值永远不会发送到服务器。你为什么需要它们?我看到第一个是只读的。您希望对只读字段进行什么验证?
  • @DarinDimitrov:我正在使用 JavaScript 将完整的日期和时间值复制到隐藏的输入中(请参阅我的更新)。
  • 所以您需要对第二个字段进行验证,因为第一个字段是只读的?您需要更精确的哪种验证?
  • 第一个字段是只读的,以防止用户手动输入日期,但当用户从日期选择器中选择日期时,它将更新。如果模型中的 DateTime 字段是例如标记为[Required] 我希望第一个输入都具有data-val-required 属性。如果模型元数据具有IsRequired=true,则在某个地方创建data-val-required 属性的逻辑。我想重用这个逻辑。

标签: asp.net asp.net-mvc-3 mvc-editor-templates


【解决方案1】:

如果你想要 HTML5 data-* 验证属性,你可以使用 HTML 助手来生成这些输入:

@{
    var validationAttributes = Html.GetUnobtrusiveValidationAttributes("");
}
@Html.TextBox(
    "", 
    Model.HasValue ? Model.Value.Date.ToString() : string.Empty, 
    new RouteValueDictionary(validationAttributes) 
    { 
        { "class", "datepicker" }, 
        { "readonly", "readonly" } 
    }
)

@Html.TextBox(
    "", 
    Model.HasValue ? Model.Value.TimeOfDay.ToString() : string.Empty, 
    new RouteValueDictionary(validationAttributes) 
    { 
        { "class", "time" } 
    }
)

【讨论】:

  • 谢谢! GetUnobtrusiveValidationAttributes() 是我需要但找不到的方法。
  • 返回一个空计数给我。为什么?
  • @IsaacLlopis,您的视图模型是否装饰有验证属性?
  • 是的。有预先设置的验证属性和自定义验证属性,但都继承自现有的验证属性。
  • @Darin wOw O_O。正是我想要的。
【解决方案2】:

我正在尝试做类似的事情; IDE 真的让你误入歧途。

如果您想知道模型上的某个属性是否是必需的,您有时不是在询问 [Required] 属性,而是询问它是否为 Nullable。例如:

public class MyModel
{
    public int Number1 { get; set; }
    public int? Number2 { get; set; }
}

这两个都将使用 EditorTemplates\Int32.cshtml

在您的编辑器模板中,您可以使用:

@model System.Int32?
<input id=@Html.IdForModel() @(Model is Nullable ? "" : "required") />

请注意,如果您不希望 IDE 在检查 is Nullable 时抱怨,则@model System.Int32 后面的问号(使其可以为空)是必要的。

【讨论】:

  • 安德斯编辑好; (题外话)奇怪的是我不能对编辑进行投票。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多