在MVC3编辑器模板中获取验证属性

时间:2012-01-22 19:13:02

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

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

  • 带有jQuery UI datepicker的文本框。
  • 用于输入时间的文本框。
  • 使用完整的日期和时间字符串通过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属性。我想改为生成属性。

3 个答案:

答案 0 :(得分:14)

如果您想要HTML5数据 - *验证属性,可以使用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" } 
    }
)

答案 1 :(得分:1)

我试图做类似的事情; 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") />

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

答案 2 :(得分:0)