web-dev-qa-db-ja.com

DateTimeフィールドとHtml.TextBoxFor()ヘルパー。正しく使用する方法は?

モデルにDateTimeフィールドがあります。このフィールドを強い型付けの部分ビューでこのように使用しようとすると

<%= Html.TextBoxFor(model => model.DataUdienza.ToString("dd/MM/yyyy"), new { style = "width: 120px" })  %>

実行時に次のコンパイルエラーが発生します

System.InvalidOperationException : Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.

とにかく、フォーマットを削除してToString( "dd/MM/yyyy")を使用すると、すべてが機能しますが、フィールドは、私がまったく必要としない時間部分を使用してフォーマットされます。

どこで間違っているのですか?これを処理する正しい方法はどれですか?

助けてくれてありがとう!

[〜#〜]編集[〜#〜]

これはモデルクラスのプロパティ宣言です

[Required]
[DisplayName("Data Udienza")]
[DataType(DataType.Date)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
public DateTime DataUdienza { get; set; }
21
Lorenzo

DateTime.ascxというエディターテンプレートを作成します。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime?>" %>
<%=Html.TextBox("", (Model.HasValue ? Model.Value.ToString("MM/dd/yyyy") : string.Empty), ViewData) %>

Views/Shared/EditorTemplatesフォルダーに配置します。今あなたが呼び出すとき:

<%= Html.EditorFor(model => model.DataUdienza) %>

DateTimeは時刻なしでフォーマットされます。

これは、このように呼び出されたすべてのDateTimeで発生しますが...

カスタムhtml属性は次のように使用できます。

<%= Html.EditorFor(model => model.DataUdienza, new {customAttr = "custom", @class = "class"}) %>

これは、ViewDataとしてEditorTemplateに渡されます。

12
Rohrbs

私はこれをmvc 4で使用します。これも機能します〜

@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
23
DarkMFJ
<%= Html.EditorFor(model => model.DataUdienza) %>

そしてあなたのモデルでは:

[DisplayFormat(ApplyFormatInEditMode = true, 
               DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime DataUdienza { get; set; }

EditorForの欠点は、生成されたフィールドにカスタムhtml属性を適用できないことです。別の方法として、TextBoxヘルパーを使用できます。

<%= Html.TextBox("DataUdienza", Model.Date.ToString("dd/MM/yyyy"), new { style = "width: 120px" })%>
19
Darin Dimitrov

少なくともかみそりを使用している場合は、テンプレートに名前を付けることができるため、すべてのDateTimeに同じテンプレートを使用する必要はありません。

@Html.EditorFor(m => m.StartDate, "Date")

ここで、Date.cshtmlには、TextBoxForまたは@JungleFreakなどの他のエディターが含まれています。

@model DateTime?

@Html.TextBox("", Model.HasValue ? Model.Value.ToShortDateString() : string.Empty, 
    new { data_datepicker = true })
2
Bondolin

おそらく拡張メソッドを作成できます:

    public static MvcHtmlString DateTimeFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        var compilationResult = expression.Compile();
        TValue dateValue = compilationResult((TModel)html.ViewDataContainer.ViewData.Model);
        var body = (MemberExpression)expression.Body;
        return html.TextBox(body.Member.Name, (Convert.ToDateTime(dateValue)).ToCustomDateFormat(), new { id = body.Member.Name, datepicker = true });
    }

メソッドToCustomDateFormatは、文字列値を目的の形式で返すdateTime型の拡張メソッドである場合があります。

使用法:

@Html.DateTimeFor(x=>x.AnyDateTimeProperty)

私にとってはうまくいきました(DateTimeおよびDateTime?プロパティ)、ただし、実行時に式をコンパイルすることが適切かどうかはわかりません。

1
bussa