【问题标题】:custom htmlhelper with validation support具有验证支持的自定义 htmlhelper
【发布时间】:2011-11-20 23:23:53
【问题描述】:

我正在使用我自己的自定义 HtmlHelper 来启用 AutoComplete support on a Select List

这一切正常,但我需要能够支持我的 ViewModel 中的 DataAnnotations。

这是我当前(工作的)HtmlHelper(无验证)

    <Extension()>
    Public Function AutoCompleteDropDownList(ByVal helper As HtmlHelper, name As String, autoCompleteSelectListItem As List(Of AutoCompleteSelectListItem), htmlAttributes As Object) As MvcHtmlString
        Dim selectBuilder As New TagBuilder("select")
        selectBuilder.MergeAttribute("name", name)
        selectBuilder.MergeAttributes(New RouteValueDictionary(htmlAttributes))
        selectBuilder.MergeAttribute("autocorrect", "off")
        selectBuilder.MergeAttribute("autocomplete", "off")

        Dim selectListBuilder As New TagBuilder("option")
        selectListBuilder.MergeAttribute("value", "")
        selectListBuilder.MergeAttribute("selected", "selected")

        Dim innerHtmlBuilder As New StringBuilder
        innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))


        For Each item In autoCompleteSelectListItem
            selectListBuilder = New TagBuilder("option")
            selectListBuilder.MergeAttribute("value", item.Value)
            selectListBuilder.MergeAttribute("data-alternative-spellings", item.AlternativeSpellings)
            selectListBuilder.MergeAttribute("data-relevancy-booster", item.RelevancyBooster)
            selectListBuilder.InnerHtml = item.Label
            innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
        Next

        selectBuilder.InnerHtml = innerHtmlBuilder.ToString()

        Return MvcHtmlString.Create(selectBuilder.ToString(TagRenderMode.Normal))
    End Function

如何重写它以支持验证?类似AutoCompleteDropDownListFor()

PS:C# 解决方案完全可以接受,我正在做的项目是 VB,但我不介意翻译。


PS:我正在浏览http://aspnet.codeplex.com 上的源代码,但找不到对DropDownListFor 的任何引用

【问题讨论】:

    标签: asp.net-mvc-3 validation html-helper


    【解决方案1】:

    您必须下载source code,然后您会在mvc3-rtm-sources.zip\mvc3-rtm-sources\mvc3\src\SystemWebMvc\Mvc\Html\SelectExtensions.cs 中找到 DropDownListFor 助手的实现。要启用客户端验证,您必须在下拉列表中发出 HTML5 data-* 属性。这是通过调用htmlHelper.GetUnobtrusiveValidationAttributes 方法在SelectInternal 方法结束时完成的。

    <Extension()>
    Public Function AutoCompleteDropDownList(ByVal helper As HtmlHelper, name As String, autoCompleteSelectListItem As List(Of AutoCompleteSelectListItem), htmlAttributes As Object) As MvcHtmlString
        Dim selectBuilder As New TagBuilder("select")
        selectBuilder.MergeAttribute("name", name)
        selectBuilder.MergeAttributes(New RouteValueDictionary(htmlAttributes))
        selectBuilder.MergeAttribute("autocorrect", "off")
        selectBuilder.MergeAttribute("autocomplete", "off")
    
        Dim selectListBuilder As New TagBuilder("option")
        selectListBuilder.MergeAttribute("value", "")
        selectListBuilder.MergeAttribute("selected", "selected")
    
        Dim innerHtmlBuilder As New StringBuilder
        innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
    
    
        For Each item In autoCompleteSelectListItem
            selectListBuilder = New TagBuilder("option")
            selectListBuilder.MergeAttribute("value", item.Value)
            selectListBuilder.MergeAttribute("data-alternative-spellings", item.AlternativeSpellings)
            selectListBuilder.MergeAttribute("data-relevancy-booster", item.RelevancyBooster)
            selectListBuilder.InnerHtml = item.Label
            innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
        Next
    
        selectBuilder.InnerHtml = innerHtmlBuilder.ToString()
        selectBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(name))
    
        Return MvcHtmlString.Create(selectBuilder.ToString(TagRenderMode.Normal))
    End Function
    

    更新:

    根据 cmets 部分的要求,强类型化的帮助器版本如下所示:

    <Extension()>
    Public Function AutoCompleteDropDownListFor(Of TModel, TProperty)(helper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TProperty)), autoCompleteSelectListItem As List(Of AutoCompleteSelectListItem), htmlAttributes As Object) As IHtmlString
        Dim name = ExpressionHelper.GetExpressionText(expression)
        Dim fullHtmlFieldName As String = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name)
    
        Dim selectBuilder = New TagBuilder("select")
        selectBuilder.MergeAttribute("name", fullHtmlFieldName)
        selectBuilder.MergeAttributes(New RouteValueDictionary(htmlAttributes))
        selectBuilder.MergeAttribute("autocorrect", "off")
        selectBuilder.MergeAttribute("autocomplete", "off")
    
        Dim selectListBuilder = New TagBuilder("option")
        selectListBuilder.MergeAttribute("value", "")
        selectListBuilder.MergeAttribute("selected", "selected")
    
        Dim innerHtmlBuilder = New StringBuilder()
        innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
    
        For Each item In autoCompleteSelectListItem
            selectListBuilder = New TagBuilder("option")
            selectListBuilder.MergeAttribute("value", item.Value)
            selectListBuilder.MergeAttribute("data-alternative-spellings", item.AlternativeSpellings)
            selectListBuilder.MergeAttribute("data-relevancy-booster", item.RelevancyBooster)
            selectListBuilder.InnerHtml = item.Label
            innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
        Next
    
        selectBuilder.InnerHtml = innerHtmlBuilder.ToString()
        selectBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(name))
    
        Return MvcHtmlString.Create(selectBuilder.ToString(TagRenderMode.Normal))
    End Function
    

    【讨论】:

    • 谢谢达林,发送模型而不是字符串会更聪明吗?类似于TextBoxFor 的做法?如果是这样,那会是什么样子?
    • @ChaseFlorell,是的,使用强类型帮助器AutoCompleteDropDownListFor 采用 lambda 表达式而不是硬编码的魔术字符串会好得多。我已经更新了我的答案来举例说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多