モデルに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; }
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に渡されます。
私はこれをmvc 4で使用します。これも機能します〜
@Html.TextBoxFor(x => x.DatePurchase, "{0:yyyy-MM-dd}", new { @class = "dateInput", @placeholder = "plz input date" })
<%= 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" })%>
少なくともかみそりを使用している場合は、テンプレートに名前を付けることができるため、すべての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 })
おそらく拡張メソッドを作成できます:
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?
プロパティ)、ただし、実行時に式をコンパイルすることが適切かどうかはわかりません。