1

我想检查表单中上传的文件,以验证它是 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调用并通过或失败,文件类型错误。问题是这个上传表单进入了一个局部视图,它位于另一个模型不是 type 的视图中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%;"/>
}

4

1 回答 1

0

在您的操作的视图模型中,您File可以包含一个UploadViewModel属性而不是 include 吗?

class MyViewModel
{
  // Other data

  public UploadViewModel Upload { get; set; }
}

然后你可以给你的局部视图一个特定的模型类型:

@model MvcApplication1.Models.UploadViewModel

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

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

@Html.Partial("_MyPartialView", Model.Upload)

另一种方法是将您的局部视图放在一个EditorTemplates子文件夹中并重命名它以匹配您的UploadViewModel类名(例如 UploadViewModel.cshtml)。然后您可以使用以下内容来呈现您的局部视图:

@Html.EditorFor(m => m.Upload)

它会自动找到视图。

于 2013-06-05T19:39:20.610 回答