1

私がこのようなViewModelを持っている場合:

public class SignupViewModel
{
   [Required]
   [DisplayName("Email:")]
   public string EmailAddress { get; set; }   
}

そして、EditorForを使用してフォームフィールドをレンダリングします。

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

レンダリングされます<input type="text">。涼しい。

しかし、この特定のシナリオでは、私はすでに別のソースから電子メールを取得しており、フォームにこのデータを事前に入力し、テキストボックスの代わりにラベルを表示したいと思います(電子メールを変更したくないため-理由は気にしないでください)。

使用できることはわかって[UIHint]いますが、コントローラーからプログラムで使用できますか?

例えば:

var model = new SignupViewModel();
model.EmailAddress = GetFromMysterySource(); // How do i set a UIHint?

これにアプローチするための最良の方法は何ですか?別のViewModelを完全に使用する必要があります。これは、ビューを強い型から強い型に変更することを意味する可能性がありますか、dynamic使用しないEditorForか、カスタムエディターテンプレートを使用する必要がありますか?

提案/アドバイスをいただければ幸いです。

4

1 に答える 1

2

実行時に属性を適用することはできません。私の提案は、ビューに少しロジックを組み込んで、ビューがデータをレンダリングする方法を制御することです。どのディスプレイを選択するかをビューに示すために、モデルを拡張する必要がある場合があります。

  @if (Model.EmailAddressIsFixed)
  {
     @Html.DisplayFor( m => m.EmailAddress )
     @Html.HiddenFor( m => m.EmailAddress ) // only if you need it to post back
  }
  else
  {
     @Html.EditorFor( m => m.EmailAddress )
  }

これを複数の場所で実行している場合は、同じことを実行するカスタムエディタテンプレートがおそらく適切です。

  @Html.EditorFor( m => m.EmailAddress, 
                   "FixedAddressTemplate",
                   new { Fixed = Model.EmailAddressIsFixed } )
于 2011-04-05T01:21:51.093 に答える