1

モデルのすべてのデータタイム オブジェクトに対して EditorFor テンプレートを構成したいと考えています。

次のエラーが表示されます。

\EditorTemplates\DateTime.cshtml(1): エラー CS1973: 'System.Web.Mvc.HtmlHelper' には 'TextBox' という名前の適用可能なメソッドがありませんが、その名前の拡張メソッドがあるようです。拡張メソッドは動的にディスパッチできません。動的引数をキャストするか、拡張メソッド構文を使用せずに拡張メソッドを呼び出すことを検討してください。

これは、DateTime.cshtml という名前の EditorTemplate 内にあるコード全体で、EditorTemplates フォルダーに配置されています。

何か案は?

これが私のビューで呼び出すものです:

<div class="editor-label">
    @Html.LabelFor(model => model.DateOfBirth)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.DateOfBirth)
    @Html.ValidationMessageFor(model => model.DateOfBirth)
</div>

そして、これは私が作成したカスタム EditorTemplate です。

@Html.TextBox("", Model, new { @class = "date-selector" });

THE EDITOR IS WORKING

基本的に、モデル内のすべての日時オブジェクトに対して、クラス「date-selector」をその html 要素に追加したいと考えています。これは jQueryUI 用です。

私は何を間違っていますか?

4

3 に答える 3

4

次のように拡張メソッドを作成できます。

 public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return htmlHelper.TextBoxFor(expression, "{0:M/dd/yyyy}", new { @class = "datepicker text" });
    }

次に、以下のようにビューで使用します。

@Html.CalenderTextBoxFor(model => model.Employee.HireDate)
于 2012-02-17T22:11:57.547 に答える
4

エディター テンプレートのモデル タイプを定義する必要があります。cshtml ファイルの先頭に「@model DateTime」を追加します。

@model DateTime
@Html.TextBox("", Model, new { @class = "date-selector" }); 
THE EDITOR IS WORKING 
于 2011-08-21T23:29:28.640 に答える
0

これは古い質問であることは知っていますが、同じイライラする問題があり、すべての DateTime 値に適用される EditorTemplate を作成したくありませんでした (JQueryUI ドロップではなく時間を表示したい UI がありました-ダウンカレンダー)。私の調査では、私が遭遇した根本的な問題は次のとおりです。

  • 標準のTextBoxForヘルパーを使用すると、"date-picker" のカスタム クラスを適用して目立たない JQueryUI カレンダーをレンダリングできますが、TextBoxFor は時刻なしで DateTime をフォーマットしないため、カレンダーのレンダリングが失敗します。
  • 標準のEditorForは、DateTime を書式設定された文字列として表示します ( などの適切な属性で装飾されている[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]場合、カスタムの「日付ピッカー」クラスを適用することはできません。

したがって、@ Ashraf の回答を拡張し、次の利点を持つカスタム HtmlHelper クラスを作成しました。

  • このメソッドは、DateTime を、JQuery カレンダーが必要とする ShortDateString に自動的に変換します (時間が存在する場合、JQuery は失敗します)。
  • デフォルトでは、ヘルパーは必要な htmlAttributes を適用して JQuery カレンダーを表示しますが、必要に応じてオーバーライドできます。
  • 日付が null の場合、MVC は 1/1/0001 の日付を値として設定します。このメソッドはそれを空の文字列に置き換えます。

ある時点で他の誰かに役立つことを期待して、これをここに投稿します。必要な変更に関する提案は大歓迎です。

public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
  var mvcHtmlString = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, htmlAttributes ?? new { @class = "text-box single-line date-picker" });
  var xDoc = XDocument.Parse(mvcHtmlString.ToHtmlString());
  var xElement = xDoc.Element("input");
  if (xElement != null)
  {
    var valueAttribute = xElement.Attribute("value");
    if (valueAttribute != null)
    {
      valueAttribute.Value = DateTime.Parse(valueAttribute.Value).ToShortDateString();
      if (valueAttribute.Value == "1/1/0001")
        valueAttribute.Value = string.Empty;
    }
  }
  return new MvcHtmlString(xDoc.ToString());
}

date-pickerまた、クラス装飾を使用してオブジェクトを検索し、カレンダーをレンダリングする JQuery 構文を知りたい場合は、次のとおりです。

$(document).ready(function () {
  $('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
  $('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});

うまくいけば、これは将来、このニーズを持つ誰かを助けるでしょう.

于 2012-02-26T15:33:35.173 に答える