2012-01-22 6 views
3

3つのフィールドで構成された日付と時刻を入力するためのエディターテンプレートを作成しています。MVC3エディターテンプレートでの検証属性の取得

  • jQuery UI datepickerを持つテキストボックス。
  • 時間を入力するためのテキストボックス。
  • javascriptによって完全な日時文字列で更新される隠し入力です。

考えられるのは、モデルにバインドされているフィールドが1つだけであるのに対し、ユーザーに表示される日付と時刻のフィールドを別にすることです。表示されるフィールドが変更されるたびに、非表示フィールドが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タグ内に存在している:

<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

したがって、第1フィールドは読み取り専用であるため、第2フィールドで検証が必要ですか?より正確にどんなバリデーションが必要ですか? –

答えて

14

あなたはDATA- *検証はそれらの属性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

ありがとう! 'GetUnobtrusiveValidationAttributes()'は必要なメソッドでしたが見つかりませんでした。 –

+1

私に空の数を返します。どうして? –

+0

@IsaacLlopisは、検証属性で飾られたビューモデルですか? –

1

私は似た何かをしようとしていました。 IDEは本当にあなたをここから逸らすのです。

モデルのプロパティが必要かどうかを知りたい場合は、[Required]属性を要求していないことがありますが、Nullableであるかどうかを尋ねることがあります。例えば:(それがNULL可能で作る@model System.Int32後に疑問符こと

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

注:

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

は、これらの両方は、あなたが使用することができ、あなたのエディタのテンプレートではEditorTemplates \ Int32.cshtml

を使用します。 )は、IDEがis Nullableをチェックするときに不平を言うことを望まない場合に必要です。あなたは、クライアント側の検証を提供するためのアダプタを登録する必要があります

+0

いいえ、それはAndersの編集です。 (トピック外)私は編集をupvoteすることはできません奇妙です。 –

関連する問題