現在、MultiImageUploaderビューモデルに強く型付けされている画像アップローダーエディターテンプレートがあります。問題は、MultiImageUploaderビューモデルを経由する代わりに、エディターテンプレートを直接呼び出すビューモデルで使用したいカスタムデータ検証属性があることです。
事前設定された検証属性を使用してMultiImageUploaderビューモデルを呼び出す代わりに、次のようなことを行います。
public class CreateBrandViewModel
{
.....<snipped>.....
[PermittedFileExtensions("jpg, jpeg, png, gif")]
[MaxFileSize("2MB")]
[UIHint("MultiImageUploader")]
public HttpPostedFileBase Image { get; set; }
//Currently this view model looks like this:
//public MultiImageUploader Image { get; set; } <-- seperate view model
}
エディターテンプレートがCreateBrandViewModelに対して強く型付けされていないため、現在、好みの方法を使用できません。呼び出し元のビューモデルの@modelをエディターテンプレートビューに渡す方法はありますか?:
@model // Here? //
<div class="editor-field">
@Html.TextBoxFor(x => x.Image, new { type = "file" })
@Html.ValidationMessageFor(x => x.Image)
</div>
編集1
明確にするために、これを実行したい理由は、画像アップローダーから汎用ファイルアップローダーに変更したいためです。これには、さまざまなビューモデルでさまざまな検証属性が必要になります。現在これを行うには、わずかに異なる検証パラメーターのバリエーションごとに異なるビューモデルとエディターテンプレートを作成する必要があります。
編集2:@JoelAthertonsの回答について
これを実装しようとすると、いくつかの問題が発生しました(または、正しく理解していない可能性があります)。
インターフェイスと抽象クラスを作成しました。私のCreateBrandViewModelはFileUploadから継承するようになりました。FileUploadは現在空であり、共有プロパティはありません。model.GetType()。Nameを試してみると、「オブジェクトのインスタンスに設定されていないオブジェクト参照」が表示されます。エラー。コードは次のとおりです。
コントローラはCreateBrandViewModelをビューに渡します。
[HttpGet]
public ActionResult Create()
{
var model = new CreateBrandViewModel();
model.IsActive = true;
return View(model);
}
次に、作成ビューはEditorTemplateを呼び出します。
@model CumbriaMD.Infrastructure.ViewModels.BrandViewModels.CreateBrandViewModel
@Html.EditorFor(model => model.File, "EditorTemplates/MultiImageUploader")
テンプレートは(単純化のために)次のようになります。
@model CumbriaMD.Infrastructure.ViewModels.FileUploadViewModels.FileUpload
@{
var partialView = Model.GetType().Name;
}
<h1>@partialView</h1>
任意のアイデアをいただければ幸いです:)