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:关于@Joel Athertons 的回答

我在尝试实现这一点时遇到了一些问题(或者我可能只是没有正确理解)。

我已经创建了接口和抽象类。我的 CreateBrandViewModel 现在继承自 FileUpload。FileUpload 当前为空,没有共享属性。当我尝试 model.GetType().Name 时,我得到一个“对象引用未设置为对象的实例”。错误。代码如下:

控制器将 CreateBrandViewModel 传递给视图:

    [HttpGet]
    public ActionResult Create()
    {
        var model = new CreateBrandViewModel();
        model.IsActive = true;

        return View(model);
    }

Create 视图然后调用 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

我处理这个问题的方法是拥有一个接口,所有允许上传的模型都将实现该接口。如果您实际上具有通用功能,我还将它与具有任何通用属性、属性等的抽象模型相结合。然后您的每个单独的模型将继承抽象类(或者如果您不使用接口,则实现接口类),然后您可以将其用作您的 @model 语句。然后,您可以简单地将任何一次性的部分拆分为可以做自己的事情的部分视图。

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

If your class looks like this:

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

and you have an EditorTemplate called MultiImageUploader.cshtml, then that would look like:

@model HttpPostedFileBase

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

And you would render it in your overall view with:

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