2011-02-03 20 views
18

私はasp.net mvc 3を使用していますが、私はこのエラーが発生し続けており、テンプレートを使用していないので理解できません。これを実行しようとするとテンプレートエラーが発生しますか?

私は私の部分図

@model ViewModels.FormViewModel 

    <div="tabs-1"> 
     @Html.TextBoxFor(x => x.Due.ToShortDateString()) 
    </div> 
私のviewmodelで

public class FormViewModel 
    { 
     public DateTime Due { get; set; } 


     public FormViewModel() 
     { 
      DueDate = DateTime.UtcNow;   
     } 
    } 

でこれを持っていると私は

テンプレートが唯一のフィールド アクセス、プロパティで使用することができ、このエラーが出ますアクセス、 一次元配列インデックス、または シングルeパラメータカスタムインデクサ 式。説明:未処理の は、現在のWeb要求の実行中に例外が発生しました。 エラーについての詳細は のスタックトレースを参照し、 がコード内で発生した場所を確認してください。

例外の詳細:System.InvalidOperationExceptionが : テンプレートが唯一のフィールド アクセス、プロパティへのアクセス、 単一次元配列のインデックス、または 単一パラメータのカスタムインデクサ 表現で使用することができます。

答えて

51

このようにする必要があります:

@Html.TextBoxFor(x => x.Due) 

そして、あなたは、この日付のためのいくつかの形式が必要な場合:

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

、その後:あなたが本当にしたい場合の

@Html.EditorFor(x => x.Due) 

この.ToShortDateString()メソッドを使用するには、強くないPEDヘルパー(明らかにそれは私が反対推薦する何か):

@Html.TextBox("Due", Model.Due.ToShortDateString()) 
+1

@ダリンDimitrov - 私はそれが文字列にとにかくレンダリングされるように私はそこに悪い例を使用したと思う。 「ToShortDateString()」を使用したいのですが、なぜそれを使用できないのですか? – chobo2

+0

@ chobo2では、 'DisplayFormat'属性と' Html.EditorFor'ヘルパーを使って書式を指定することができます。 –

+0

@Darin Dimitrov - だから、私が使っているものはテンプレートと見なされますか?だから、ヘルパーのためのテンプレートはどれですか?それらを変更するには、Tomas Lycken氏が言ったように編集するか、データの注釈を使って見てください。 – chobo2

5

.TextBoxFor() HTMLヘルパーがビルトインテンプレート(文字列入力用テキストボックス)を使用している、とあなたが与えているので、あなたがエラーを取得していますそれはあまりにも複雑なラムダ式(すなわち、メッセージに記載されている種類のセットに属しません)。

問題を解決するには、編集するプロパティのタイプをstringに変更するか、MVCでデフォルトの文字列テンプレートを使用するか、MVCでデフォルトのdatetimeテンプレートを使用させるかのいずれかを行います。私は後者をお勧めします:

@Html.TextBoxFor(m => m.Due) 

あなたは、ユーザーが日付を編集することが求められている方法に満足していない場合は、〜/ビュー/共有/ EditorTemplatesに「DateTime.cshtml」という名前の部分図を置きますエディタをビルドして、好きなように動作します。

+0

@ Tomas Lycken - この新しい私は剃刀を使い始める前に問題があることを覚えていませんか?もし私が自分自身を構築すれば、すべての日付がこれを得るでしょうか?私がしたくないものさえも?たとえば、ToShortDateString()を持つ日付のうちの1つだけを必要としていて、他のすべてのものがデフォルトのようにレンダリングしていれば、これはできますか? – chobo2

+0

@ Tomas Lycken - 私がやったことはあまりにも複雑でしたか?最初に文字列に変換しないで、それをテキストボックスに入れますか?私はこのことについてもっと詳しく読むことができます(テキストボックスのこれらの処理について)。ちょっと変わったようです。 – chobo2

+0

@ chobo2:問題は、レンダリングするのが非常に複雑なことではありません。 (入力フィールドの 'name'属性に使用される)ViewModelプロパティの名前は、エラーメッセージにリストされたものよりも深いステートメントを許可するとはるかに複雑になります。日付の出力に影響を与えたい場合は、 '[DisplayFormat]'属性(または利用可能な他の属性の1つ)を使用するか、独自のテンプレートを作成してください。 –

5

あなたはMVCを使用し、インラインコードの要素を持っている場合は、次のようにパラメータを設定してみてください -

@{ 
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString(); 

} 

@Html.DisplayFor(model => parameterValue) 
+0

私はDateTime.Parseを必要としませんでした。単に文字列です。datevalue = item.LastUpdate.ToShortDateString(); –

6

強く型付けされ、それを維持しながら、これを達成するのを助けることができますオーバーロードがあります。

// Specify that you're providing the format argument (string) 
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString()) 

// Or use the overload with format and html options, where null is the htmloptions 
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null) 
0

あなたはtextboxforのパラメータでメソッドを渡す代わりに式を渡すことによってアプリケーションを誤解されています。

あなたは持っていた:

@Html.TextBoxFor(x => x.Due.ToShortDateString()) 

ストアあなたの結果変数にして、式を使用します。代わりにモデルとして以下を使用@value注釈形式を追加するこの

var shortDate = Model.Due.ToShortDateString(); 
@Html.TextBoxFor(x => shortDate) 
0

を試みる

@ Html.TextBoxFor(X => x.Due新しい{@値= Model.Due.ToShortDateString()})

関連する問題