C# 用于在上载表单提交时验证文件类型的自定义属性

C# 用于在上载表单提交时验证文件类型的自定义属性,c#,asp.net-mvc,C#,Asp.net Mvc,我想在表单中对上传的文件执行检查,以验证它是CSV文件还是TXT文件 我创建了一个自定义属性,如下所示: public class ValidateUploadAttribute : RequiredAttribute { public override bool IsValid(object value) { var file = value as HttpPostedFileBase; if (file == null) {

我想在表单中对上传的文件执行检查,以验证它是CSV文件还是TXT文件

我创建了一个自定义属性,如下所示:

public class ValidateUploadAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        var file = value as HttpPostedFileBase;
        if (file == null)
        {
            return false;
        }

        if (file.ContentType != "text\\CSV" || file.ContentType != "text\\TXT")
        {
            return false;
        }

        return true;
    }
}
然后创建了一个如下所示的视图模型

[ValidateUploadAttribute(ErrorMessage = "Please select a TXT or CSV file")]
public HttpPostedFileBase File { get; set; }
我的
HttpPost
控制器看起来像

public ActionResult Upload(UploadViewModel uploadViewModel, string site)
{
    ...
}
所以,到目前为止,一切都很好。调用
ValidateUploadAttribute
,通过或失败,文件类型错误。问题是这个上传表单进入了一个局部视图,它位于另一个视图的内部,该视图的模型不是类型
UploadViewModel
,因此我不能调用类似
@Html.ValidateFor(x=>x.File)
(即,验证失败,但实际上没有做任何事情,因为我无法将验证助手放入视图中)

局部视图

<div id="upload-form" class="div-center content-div" style="margin-top: 15px;">
@using (Html.BeginForm("Upload", "Association", FormMethod.Post, new { enctype = "multipart/form-data", id = "upload-form"}))
{

    <input type="file" name="File" style="width: 79%;"/>
    <input type="submit" value="Upload for Add" style="width: 19%;"/>
}

@使用(Html.BeginForm(“Upload”、“Association”、FormMethod.Post、new{enctype=“multipart/formdata”、id=“Upload form”}))
{
}

在操作的视图模型中,是否可以包含
UploadViewModel
属性,而不是包含
文件

class MyViewModel
{
  // Other data

  public UploadViewModel Upload { get; set; }
}
然后,可以为局部视图提供特定的模型类型:

@model MvcApplication1.Models.UploadViewModel
完成此操作后,可以添加
@Html.ValidationFor(m=>m.File)

在包围视图中,渲染局部视图,但也在模型中传递:

@Html.Partial("_MyPartialView", Model.Upload)
另一种方法是将部分视图放在
编辑器或模板
子文件夹中,并将其重命名以匹配
UploadViewModel
类名(例如UploadViewModel.cshtml)。然后,可以使用以下选项渲染局部视图:

@Html.EditorFor(m => m.Upload)
它将自动找到视图