Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在EditorTemplate中动态分配@model类型吗?_C#_Asp.net Mvc 3_Templates_Editor_Viewmodel - Fatal编程技术网

C# 我可以在EditorTemplate中动态分配@model类型吗?

C# 我可以在EditorTemplate中动态分配@model类型吗?,c#,asp.net-mvc-3,templates,editor,viewmodel,C#,Asp.net Mvc 3,Templates,Editor,Viewmodel,我有一个图像上传器编辑器模板,它当前是MultiImageUploader视图模型的强类型。问题是我有一些自定义数据验证属性,我希望在直接调用编辑器模板的视图模型中使用这些属性,而不是通过MultiImageUploader视图模型进行路由 与使用预设验证属性调用MultiImageUploader视图模型不同,我想做如下操作: @model CumbriaMD.Infrastructure.ViewModels.FileUploadViewModels.FileUpload @{ v

我有一个图像上传器编辑器模板,它当前是MultiImageUploader视图模型的强类型。问题是我有一些自定义数据验证属性,我希望在直接调用编辑器模板的视图模型中使用这些属性,而不是通过MultiImageUploader视图模型进行路由

与使用预设验证属性调用MultiImageUploader视图模型不同,我想做如下操作:

@model CumbriaMD.Infrastructure.ViewModels.FileUploadViewModels.FileUpload

@{
    var partialView = Model.GetType().Name;
}

<h1>@partialView</h1>
public class CreateBrandViewModel
{
    [PermittedFileExtensions("jpg, jpeg, png, gif")]
    [MaxFileSize("2MB")]
    [UIHint("MultiImageUploader")]
    public HttpPostedFileBase Image { get; set; }
}
public类CreateBrandViewModel
{
..........
[许可文件扩展(“jpg、jpeg、png、gif”)]
[最大文件大小(“2MB”)]
[UIHint(“MultiImageUploader”)]
公共HttpPostedFileBase映像{get;set;}
//当前此视图模型如下所示:

//公共MultiImageUploader Image{get;set;}如果您的类如下所示:

@model CumbriaMD.Infrastructure.ViewModels.FileUploadViewModels.FileUpload

@{
    var partialView = Model.GetType().Name;
}

<h1>@partialView</h1>
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)

如果您的类看起来像这样:

@model CumbriaMD.Infrastructure.ViewModels.FileUploadViewModels.FileUpload

@{
    var partialView = Model.GetType().Name;
}

<h1>@partialView</h1>
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)

我处理这个问题的方法是,有一个接口,允许上传的所有模型都将实现该接口。如果您实际上有公共功能,我还将把它与具有任何公共属性、属性等的抽象模型结合起来。然后,您的每个模型都将继承抽象类(如果不使用类,也可以实现接口),然后可以将其用作@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);
    }
}

我处理这个问题的方法是,有一个接口,允许上传的所有模型都将实现该接口。如果您实际上有公共功能,我还将把它与具有任何公共属性、属性等的抽象模型结合起来。然后,您的每个模型都将继承抽象类(如果不使用类,也可以实现接口),然后可以将其用作@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);
    }
}

在我看来,这可能会生成编译错误,因为类不继承
HttpPostedFileBase
,因此不能在
@model
语句后面使用。如果@Html.EditorFor(m=>m.Image),则不会使用时,它是模型的Image属性的编辑器模板。在我看来,这可能会生成编译错误,因为该类不继承
HttpPostedFileBase
,因此无法在
@model
语句后面使用。如果@Html.EditorFor(m=>m.Image),则不会是使用的,它是模型的Image属性的编辑器模板。嘿,很抱歉花了一段时间来响应-昨天被绑住了!这看起来很好,谢谢,好主意。今天早上将实现它。不过有一件事,if语句-我是否必须为每个实现FileUploadModel的模型编写if语句(考虑到我还没有尝试过)?谢谢!Hrrmm我想我现在理解得更好一些。但是如果我能得到模型的类型并使用严格的命名约定,我甚至可以正则化model.GetType().Name字符串以删除“ViewModel”,并将其放入Html.RenderPartial(regExResult+“PartialView”),model)?在实现这个好主意时遇到了一些问题,更新了原始帖子:)嘿,很抱歉花了一段时间来回复-昨天被绑住了!这看起来很好,谢谢,好主意。今天早上将实现它。不过有一件事,if语句-我是否必须为每个实现FileUploadModel的模型编写if语句(考虑到我还没有尝试过)?谢谢!Hrrmm我想我现在理解得更好一些。但是如果我能得到模型的类型并使用严格的命名约定,我甚至可以正则化model.GetType().Name字符串以删除“ViewModel”,并将其放入Html.RenderPartial(regExResult+“PartialView”),model)?在实施这个好主意时遇到了一些问题,更新了原始帖子:)