1

ビューモデルにdoubleの配列があり、次のようなデータ形式の文字列を適用したいと思います。

class MyVM 
{
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F2}")]
    public double Currents[] { get; set; }
}

私のビューでは、以下に示すような配列でEditorForを使用しています。これは、データ形式の文字列を適用しないことを除いて、正しく機能しています。

@Html.EditorFor(model => model.Currents)

カスタムテンプレートを使用できることを学びましたが、カスタムテンプレートを作成するよりも簡単な方法があるのではないかと思いました。カスタムテンプレートが唯一の解決策である場合、フォーマットを処理する必要がある最も単純なカスタムテンプレートは何ですか?作成してみましたが、データフォーマット文字列を正しく適用できませんでした。

以下のコンテンツを使用して、〜Views\SharedフォルダーにCurrentsTemplate.cshtmlを作成できます。

@model double[]

@foreach (double x in Model) {
<div class="editor-field">
    @Html.TextBoxFor(m=>x, "{0:F2}")
</div>
}

@ Html.EditorFor(m => m.Currents、 "CurrentsTemplate")を呼び出すことでそれを使用すると、機能しますが、POST後にフォームデータが保持されません。TextBoxと一緒にforループに隠しフィールドが必要だと思います。

4

2 に答える 2

1

必要に応じて double をフォーマットするカスタム テンプレートを作成します。そうすれば、MVC が見doubleたときに、テンプレートを表示するための内部ロジックではなく、テンプレートが使用されます。

たとえば、EditorTemplatesViews\Shared フォルダーにフォルダーを作成し、double.cshtml という名前の double 型の強力な部分ビューを作成します。

このコード片

@model double

@Html.TextBoxFor(m => m, "{0:F2}")

お役に立てれば。

于 2013-03-06T08:54:22.133 に答える
0

解決策は、ヘルパーで目的のデータ形式文字列と共に実際のメンバー名を使用することです。@Html.TextBoxForデータは IEnumerable であるため、単純に for ループに配置します。生成された HTML には、ビュー モデルのメンバー名と一致する適切な名前フィールドが含まれます。これは、POST バック間のデータの永続性にとって重要です。非表示の HTML フォーム フィールドは必要ありません。

@for (int k = 0; k < Model.Currents.Count(); k++ ) {
    @Html.TextBoxFor(model => model.Currents[k], "{0:F2}")                                                           
}

上記は、適切なデータ形式で機能します。それは生成します

 <input name="Currents[0]" id="Currents_0_" type="text" data-val-number="The field Double must be a number." data-val="true" value="0.8"/>

POST バック全体で適切な永続性を使用して動作します。

次の 3 つのケースは機能しません

ケース 1:

@foreach (double x in Model) {
    @Html.TextBoxFor(m=>x, "{0:F2}")
}
  • name="x" で HTML を生成するため、POST バック間で持続しません。
  • ただし、これは適切なデータ形式を適用します。

ケース 2:

@Html.EditorFor(m => m.Currents)
  • 必要に応じてデータをフォーマットしない
  • ただし、生成された HTML で実際のビュー データ メンバー名が使用されるため、POST バック間で保持されます。

ケース 3:

@Html.EditorFor(m => m.Currents, "TemplateName")

ケース1と同じ。

于 2013-03-07T03:54:39.810 に答える