32

ビューモデルに表示専用のプロパティがいくつかありますが、ページで計算を実行するには、jQueryを使用してそれらの値を取得する必要があります。標準のHtml.DisplayFor()メソッドは、その値をページに書き込むだけです。各要素を次のようにレンダリングできるかみそりのテンプレートを作成したいと思います。

<span id="ElementsId">Element's value</span>

Html.DisplayFor()でテンプレートを指定して、プロパティのレンダリングに特定のテンプレートを使用できることは知っていますが、そのテンプレート内で、 spanタグに書き込むid属性を特定するにはどうすればよいですか?

@Html.DisplayFor(model => model.Element, "MyTemplate");
4

6 に答える 6

60

OK、私はそれを見つけました、そしてそれは実際には非常に簡単です。私のViews\Shared \ DisplayTemplatesフォルダーには、以下を含むReading.cshtmlがあります。

@model System.Int32
<span id="@ViewData.ModelMetadata.PropertyName">@Model</span>

これにより、プロパティの名前をid属性として使用し、プロパティの値をコンテンツとして使用して、正しいタグがレンダリングされます。

<span id="Reading">1234</span>

ビューファイルでは、これは次を使用して呼び出すことができます。

@Html.DisplayFor(model => model.Reading, "Reading")

または、モデルプロパティがUIHint( "Reading")で装飾されている場合、テンプレート名をDisplayFor()の呼び出しから除外しても、テンプレートを使用してレンダリングされます。

@Html.DisplayFor(model => model.Reading)

これは、カスタムエディタテンプレートでも同様に機能するはずです。

于 2011-04-19T21:07:55.363 に答える
10

ブール型プロパティのテンプレートの定義に関する多くのSO投稿を読みまし@Html.DisplayForたが、それらを明確に理解できませんでした。あなたの質問はこれに終わり、それを把握した後、私はそれを実装するために必要なすべてのステップを含む新しい答えを追加することにしました。他の人にも役立つかもしれません。

1.テンプレートの作成

最初に、以下にinパスを追加する必要がありPartial Viewます(パスは非常に重要です)。

Views/Shared/DisplayTemplates/

たとえば、次のようPartial Viewに名前を付け_ElementTemplateて入力します。

<span>
    @(@Model ? "Yes" : "No")
</span>

2.モデルへのUIHintの追加

とを接続するには、モデルクラスに次のような属性を追加する必要がありpropertyます。templateUIHint

[UIHint("_YesOrNoTemplate")]
public bool MyProperty { get; set; }

3.ビューで@Html.DisplayNameForを使用する

このプロパティが必要なすべてのビューで、以下のコードを使用できます。

<div>
    @Html.DisplayFor(modelItem => item.MyProperty)
</div>

出力

上記のコードは、私の例では以下のコードにレンダリングされます(if (MyProperty == true)):

<div>
    <span>
        Yes
    </span>
</div>

属性の設定

設定idまたはその他のhtml属性については、次のようにModelMetadataを使用できます。

<span id="@ViewData.ModelMetadata.PropertyName">
    @(@Model ? "Yes" : "No")
</span>

属性付きの出力

<div id="MyProperty">
    <span>
        Yes
    </span>
</div>
于 2018-08-13T11:14:37.663 に答える
7

ビューモデルのこのid部分を作成して、表示テンプレートで使用できます。

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>
于 2011-04-19T06:27:41.650 に答える
3

Razorの(Display + Editor)と属性について説明している記事があります。TemplatesUIHint

于 2015-04-16T10:31:26.743 に答える
1

元の投稿とまったく同じ問題が発生しました。

最後のコメントが有効かどうかわからない。HTML id属性が実行時の値になるため、デザイン時の名前で参照することはできません。

データディクショナリ(ViewBag)に新しいオブジェクトを追加できるDisplayForのオーバーロードを使用しました

私のモデルは、さまざまなプロパティを持つProjectというC#オブジェクトです。私の見解では、私はこれを持っています:

@Html.DisplayFor(model => model.ProjectName, "StringDisplaySetHtmlID", new { HtmlID = "project-name" })

これはStringDisplaySetHtmlIDと呼ばれるカスタムテンプレートを使用しており、最後のパラメーターはキーと値のペアをビューバッグに追加します。

私のテンプレートファイルは次のようになります。

@model string
<span class = "display-field" id = "@(ViewBag.HtmlID)">@Model</span> 

また、スタイリングの目的でここにクラスを設定しています。一般的な名前の衝突を避けるために、IDだけでなくキー名HtmlIDを使用しました。

これで、JavaScriptで、次のjqueryを使用してスパンのコンテンツを取得できます。

var projectName = $('#project-name').text()
于 2012-04-18T11:45:58.603 に答える
1

以下を出力する表示テンプレートを作成するための最良の方法:

<span id="ElementsId">Element's value</span>

これになります:

<span id="@Html.IdForModel()">@Html.DisplayTextFor(m => m)</span>

これらのヘルパーは、この質問が最初に投稿されたときには存在していなかった可能性がありますが、これは2つの方法でDavidの回答に基づいています。

  1. @Html.DisplayTextFor(m => m)の代わりに使用する@Modelと、基本的に値を実行するのではなく、値をレンダリングするときにデータ注釈を利用できますToString()
  2. モデルがネストまたは繰り返され、IDが単にプロパティ名になるわけではない場合は、@Html.IdForModel()代わりにを使用することをお勧めします。@ViewData.ModelMetadata.PropertyName
于 2019-03-04T04:26:15.647 に答える