2012-01-22 99 views
3

我正在編寫一個編輯器模板,用於輸入由三個字段組成的日期和時間。在MVC3編輯器模板中獲取驗證屬性

  • 帶有jQuery 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屬性。我想獲得生成的屬性。

+0

我沒有看到你的2個輸入字段的點。他們沒有名字。它們的值永遠不會發送到服務器。你爲什麼需要它們?我看到第一個是隻讀的。你想在只讀字段上進行什麼驗證? –

+0

@DarinDimitrov:我使用JavaScript將完整的日期和時間值複製到隱藏的輸入中(請參閱我的更新)。 –

+0

所以你需要第二個字段的驗證,因爲第一個字段是隻讀的?您需要更精確的驗證? –

回答

14

你可以使用HTML幫助,如果你想HTML5數據 - *屬性驗證,對他們產生這些輸入:

@{ 
    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

謝謝! 'GetUnobtrusiveValidationAttributes()'是我需要但找不到的方法。 –

+1

向我返回一個空數。爲什麼? –

+0

@IsaacLlopis,您的視圖模型是用驗證屬性裝飾的嗎? –

1

我試圖做同樣的事情; IDE真的讓你誤入歧途。

如果您想知道模型上的屬性是否需要,您有時不會要求[Required]屬性,但是它是否爲可空。例如:

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

這兩個將使用EditorTemplates \ Int32.cshtml

在你的編輯模板,你可以使用:

@model System.Int32? 
<input [email protected]() @(Model is Nullable ? "" : "required") /> 

注意問號@model System.Int32後(使其可爲空)是必要的,如果您不希望IDE在檢查is Nullable時抱怨。

+0

Anders編輯好; (無題)奇怪,我不能upvote編輯。 –

相關問題