ビューモデルをさまざまなタイプのビューから抽象化しようとしています。全体が問題なくコンパイルされますが、データ注釈の「反映」(正式にはボックス化解除と呼ばれます) に問題があります。
私はインターフェースを持っています:
public interface IPerson
{
string FirstName { get;set;}
string LastName {get;set;}
}
そして、インターフェイスをそのまま実装する2つのクラスがあります。
public class Employee : IPerson
{
[Required]
[Display(Description = "Employee First Name", Name = "Employee First Name")]
public string FirstName {get;set;}
[Required]
[Display(Description = "Employee Last Name", Name = "Employee Last Name")]
public string LastName {get;set;}
public int NumberOfYearsWithCompany {get;set;}
}
public class Client : IPerson
{
[Required]
[Display(Description = "Your first Name", Name = "Your first Name")]
public string FirstName {get;set;}
[Display(Description = "Your last Name", Name = "Your last Name")]
public string LastName {get;set;}
[Display(Description = "Company Name", Name = "What company do you work for?")]
public string CompanyName {get;set;}
}
個人編集ビュー: ビュー/個人/編集など:
@model IPerson
<div class="clear paddingbottomxxsm">
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
</div>
<div class="clear paddingbottomxxsm">
<div class="editor-label">
@Html.LabelFor(model => model.LastName)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</div>
</div>
従業員の編集ビュー: ビュー/従業員/編集:
@model Employee
Html.RenderAction("Edit", "Person", new { person = Model });
<div class="clear paddingbottomxxsm">
<div class="editor-label">
@Html.LabelFor(model => model.CompanyName)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.CompanyName)
@Html.ValidationMessageFor(model => model.CompanyName)
</div>
</div>
PersonController は次のとおりです。
public ActionResult Edit(IPerson person)
{
return PartialView(person);
}
すべてが正常にコンパイルおよびレンダリングされます。ただし、データの注釈は失われています。
したがって、従業員/編集は次のようになります。
名 [テキストフィールド]
姓 [テキストフィールド]
どちらの会社にお勤めですか?[テキストフィールド] 会社名は必須フィールドです
具象クラスのデータ注釈をボックス化解除する方法はありますか?
サイドノート
IPerson を Employee に明示的にキャストしてみました。
@model IPerson
@{
var employee = (Employee)Model;
}
<div class="clear paddingbottomxxsm">
<div class="editor-label">
@Html.LabelFor(model => employee.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => employee.FirstName)
@Html.ValidationMessageFor(model => employee.FirstName)
</div>
</div>
<div class="clear paddingbottomxxsm">
<div class="editor-label">
@Html.LabelFor(model => employee.LastName)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => employee.LastName)
@Html.ValidationMessageFor(model => employee.LastName)
</div>
</div>
これを行うと、最初の名前が必要になりましたが、ラベルから表示プロパティを取得しませんでした。
更新 これがボックス化解除であるかどうかについて多くの議論を行った後、(より基本的な)具象クラスからデータ注釈を取得する簡単な解決策をまだ見つけていません。ビュー (またはヘルパー) でリフレクションを使用して具体的なクラスのデータ注釈を取得することは、単純化の目標を実際に無効にします。
基本的には同じですが、必須フィールドと表示名がわずかに異なるいくつかのビューがあります。ビューモデルをインターフェース化されたビューに渡すだけで、必要なフィールドと表示プロパティを把握できれば、非常に便利です。誰かがこれを行う方法を見つけた場合、それは大歓迎です。