覆盖IsValid(对象值)时的自定义HttpAttribute验证始终为null

时间:2013-06-21 01:46:19

标签: asp.net-mvc validation razor

您好我有这个自定义验证,但在要验证的属性类型上有一些差异,即使我符合业务规则,ModelState的值也是“null”= s ...这里有一些代码

模型

[System.ComponentModel.DataAnnotations.Schema.Column(TypeName = "image")]
        [ValidateFile(Allowed = new string[] { ".png", ".jpeg", ".jpg" },
                      MaxLength = 1024 * 1024 * 3,
                      ErrorMessage = "Please select a PNG , JPEG , JPG image smaller than 3MB")]
public byte[] Photo { get; set; }

===========

ValidateFileAtribute

public class ValidateFileAttribute : RequiredAttribute
{
    public int MaxLength { get; set; }
    public string[] Allowed { get; set; }

    public override bool IsValid(object **value**)
    {


        var Photo = value as HttpPostedFileBase;
        if (Photo == null)
        {
            return false;
        }

        if (Photo.ContentLength > MaxLength)
        {
            return false;
        }

        if (!Allowed.Contains(Photo.FileName.Substring(Photo.FileName.LastIndexOf('.'))))
        {
            return false;
        }

        return true;

    }

这里的价值不应该是空的!!

Create.cshtml

@using (Html.BeginForm("Create", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)


    <fieldset>
        <legend>Restaurant</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.City)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.City)
            @Html.ValidationMessageFor(model => model.City)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Country)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Country)
            @Html.ValidationMessageFor(model => model.Country)
        </div>

         <div class="editor-label">
            @Html.LabelFor(model=>model.Photo)
        </div>
      <div class="editor-field">
        @Html.EditorFor(model=>model.Photo)
        @Html.ValidationMessageFor(model => model.Photo)
        <input name="ImageFile" type="file" id="ImageFile"  />
      </div>
        <p>
            <input type="submit" value="Create"  />
        </p>

    </fieldset>
}

任何帮助?

2 个答案:

答案 0 :(得分:0)

您的财产:

public byte[] Photo { get; set; }

在属性中:

var Photo = value as HttpPostedFileBase;

这将始终为null。尝试:

var Photo = value as byte[]

当然,您必须修复验证逻辑的附加部分。

答案 1 :(得分:0)

我会检查你在byte [] Photo中的位置,因为我注意到当进入的数据无效时,&#39;对象值&#39;是空的。

一个例子是,对于int的数据类型,当我输入2147483647时,&#39;对象值&#39;确实包含2147483647。

当我输入2147483648时,value参数包含0,因为最大正整数值是2147483647。

2013年7月5日更新

您需要将数据类型更改为&#34; HttpPostedFileBase&#34;

  

public HttpPostedFileBase Photo {get;组; }

而不是&#34; byte []&#34;

  

public byte [] Photo {get;组; }

应该没有必要

  

[System.ComponentModel.DataAnnotations.Schema.Column(TypeName =&#34; image&#34;)]

你的

  

(对象**值**)

现在应该包含System.Web.HttpPostedFileWrapper,其中包含要上传的文件。

这与我之前写的内容密切相关,如果进入的数据类型的类型不正确,您将获得 null