验证多个属性

我正在为本地艺术家建立一个网上商店,其中一个要求是添加一张图片以与给定产品相关联。 对于图像,有多个元素需要验证; 特别是尺寸,文件大小和类型。

目前,我有以下设置来验证图像:

[LocalizedDisplayName(typeof(StoreManagementRes), "Image")]
[ImageSize(typeof(BesLogicSharedRes),"ValidationImageFileSizeMustBeLessThan20kb")]
[ImageDimension(typeof(BesLogicSharedRes), "ValidationImageDimensionMustBeLessThan640x480")]
[ImageType(typeof(BesLogicSharedRes), "ValidationImageTypeMustBeJpgOrPng")]
public int ImageFileId { get; set; }

上传的文件确实得到了验证,但是,每次应用程序运行时,它们不一定以相同顺序调用。 最后,如果验证在多个属性上失败,则只显示一条错误消息。 再次,不一定是第一次失败的验证,也不是最后一次。 我想一次显示所有错误,以免挫伤用户。

如果这是相关的,则所有三个图像验证类都从ValidationAttribute进行分类。


有一点要感谢的是模型保留了所有的错误,而不是其中的一个,它只是显示第一个的HtmlHelper。

ValidationSummary实际上应该显示模型上的所有错误,尽管我怀疑你想要一个单独的属性的等价物。

不幸的是,有些有用的方法是私有的而不是保护的,所以它们必须复制并粘贴出ValidationExtensions.cs 。 我做了一个稍微减少的版本(没有使用错误消息的资源文件,通过获取原始版本的GetUserErrorMessageOrDefault很容易完成,但是您还必须检查是否也从类中获取相关的方法和字段) 。 我也只做了一个函数调用,但如果需要的话,它很容易引起过载。

public static MvcHtmlString ValidationSummaryForSubModel(this HtmlHelper html, bool excludePropertyErrors, string message, IDictionary<string, object> htmlAttributes)
    {
        string prefix = html.ViewData.TemplateInfo.HtmlFieldPrefix;
        var props = html.ViewData.ModelState.Where(x => x.Key.StartsWith(prefix));
        var errorprops = props.Where(x => x.Value.Errors.Any()).SelectMany(x=>x.Value.Errors);

        if (html == null) {
            throw new ArgumentNullException("html");
        }
        FormContext formContext = (html.ViewContext.ClientValidationEnabled) ? html.ViewContext.FormContext : null;
        if (formContext == null && html.ValidForSubModel())
        {
            return null;
        }

        string messageSpan;
        if (!String.IsNullOrEmpty(message)) {
            TagBuilder spanTag = new TagBuilder("span");
            spanTag.SetInnerText(message);
            messageSpan = spanTag.ToString(TagRenderMode.Normal) + Environment.NewLine;
        }
        else {
            messageSpan = null;
        }

        StringBuilder htmlSummary = new StringBuilder();
        TagBuilder unorderedList = new TagBuilder("ul");


        foreach (ModelError modelError in errorprops) {
            string errorText = GetUserErrorMessageOrDefault(html.ViewContext.HttpContext, modelError, null /* modelState */);
            if (!String.IsNullOrEmpty(errorText)) {
                TagBuilder listItem = new TagBuilder("li");
                listItem.SetInnerText(errorText);
                htmlSummary.AppendLine(listItem.ToString(TagRenderMode.Normal));
            }
        }


        if (htmlSummary.Length == 0) {
            htmlSummary.AppendLine(_hiddenListItem);
        }

        unorderedList.InnerHtml = htmlSummary.ToString();

        TagBuilder divBuilder = new TagBuilder("div");
        divBuilder.MergeAttributes(htmlAttributes);
        divBuilder.AddCssClass((html.ViewData.ModelState.IsValid) ? HtmlHelper.ValidationSummaryValidCssClassName : HtmlHelper.ValidationSummaryCssClassName);
        divBuilder.InnerHtml = messageSpan + unorderedList.ToString(TagRenderMode.Normal);

        if (formContext != null) {
            // client val summaries need an ID
            divBuilder.GenerateId("validationSummary");
            formContext.ValidationSummaryId = divBuilder.Attributes["id"];
            formContext.ReplaceValidationSummary = !excludePropertyErrors;
        }
        return MvcHtmlString.Create(divBuilder.ToString(TagRenderMode.Normal));
    }

    private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)
    {
        if (!String.IsNullOrEmpty(error.ErrorMessage))
        {
            return error.ErrorMessage;
        }
        if (modelState == null)
        {
            return null;
        }

        string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
        //return String.Format(CultureInfo.CurrentCulture, GetInvalidPropertyValueResource(httpContext), attemptedValue);
        return "Error";
    }
链接地址: http://www.djcxy.com/p/56605.html

上一篇: Validating Mutiple Attributes

下一篇: How can I validate a complex model using ASP.NET MVC 2