1

現在、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>

任意のアイデアをいただければ幸いです:)

4

2 に答える 2

1

私がこれを処理する方法は、アップロードを許可するすべてのモデルが実装するインターフェースを持つことです。実際に共通の機能がある場合は、これを共通のプロパティや属性などを持つ抽象モデルと組み合わせます。次に、個々のモデルのそれぞれが抽象クラスを継承します(または、を使用しなかった場合はインターフェイスを実装しますclass)、そしてそれを@modelステートメントとして使用できます。次に、1回限りの部分を、独自の機能を実行できる部分的なビューに分割するだけです。

public interface IFileUploadModel
{
    // any common properties would go here
}

public abstract class FileUploadModel : IFileUploadModel
{
    // implement the common stuff
}

public class CreateBrandViewModel : FileUploadModel
{
    [PermittedFileExtensions("jpg, jpeg, png, gif")]
    [MaxFileSize("2MB")]
    [UIHint("MultiImageUploader")]
    public HttpPostedFileBase Image { get; set; }
}

public class SomeOtherUploadModel : FileUploadModel
{
    // Other special stuff here
}

次に、テンプレートで。

@model FileUploadModel

@{
    // Common output code that they all do

    // Then the special stuff
    if (model.GetType().Name == "CreateBrandViewModel")
    {
        // Render the partial and pass it the model
        Html.RenderPartial("CreateBrandPartialView", Model);
    }
}
于 2012-08-16T10:44:05.627 に答える
0

クラスが次のようになっている場合:

public class CreateBrandViewModel
{
    [PermittedFileExtensions("jpg, jpeg, png, gif")]
    [MaxFileSize("2MB")]
    [UIHint("MultiImageUploader")]
    public HttpPostedFileBase Image { get; set; }
}

MultiImageUploader.cshtmlというEditorTemplateがある場合、次のようになります。

@model HttpPostedFileBase

@Html.LabelFor(m => m)
@Html.TextBoxFor(x => x, new { type = "file" })
@Html.ValidationMessageFor(x => x)

そして、あなたはそれをあなたの全体的なビューに次のようにレンダリングします:

@Html.EditorFor(m => m.Image)
于 2012-08-16T10:29:06.613 に答える