与验证支持自定义的HtmlHelper [英] custom htmlhelper with validation support

查看:147
本文介绍了与验证支持自定义的HtmlHelper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我摇滚我自己的自定义的HtmlHelper,以使在选择列表 自动完成的支持。

这是工作好了,但我需要能够支持DataAnnotations在我的ViewModel。

下面是我当前的(工作)的HtmlHelper(没有验证)

 <扩展()>
    公共职能AutoCompleteDropDownList(BYVAL帮手作为的HtmlHelper,名称作为字符串,autoCompleteSelectListItem方式列表(中AutoCompleteSelectListItem),htmlAttributes作为对象)作为MvcHtmlString
        昏暗selectBuilder作为新TagBuilder(选择)
        selectBuilder.MergeAttribute(名,名称)
        selectBuilder.MergeAttributes(新RouteValueDictionary(htmlAttributes))
        selectBuilder.MergeAttribute(自动校正,关)
        selectBuilder.MergeAttribute(自动完成,关闭)        昏暗selectListBuilder作为新TagBuilder(选项)
        selectListBuilder.MergeAttribute(价值,)
        selectListBuilder.MergeAttribute(选择,入选)        昏暗innerHtmlBuilder作为新的StringBuilder
        innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
        每个项目在autoCompleteSelectListItem
            selectListBuilder =新TagBuilder(选项)
            selectListBuilder.MergeAttribute(值,item.Value)
            selectListBuilder.MergeAttribute(数据替代拼写,item.AlternativeSpellings)
            selectListBuilder.MergeAttribute(数据关联助推器,item.RelevancyBooster)
            selectListBuilder.InnerHtml = item.Label
            innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
        下一个        selectBuilder.InnerHtml = innerHtmlBuilder.ToString()        返回MvcHtmlString.Create(selectBuilder.ToString(TagRenderMode.Normal))
    结束功能

一个人怎么会改写这个来支持验证?类似 AutoCompleteDropDownListFor()

PS:一个C#的解决方案是完全可以接受的,我工作的这个项目是在VB,但我不介意翻译


PS:我翻阅源$ C ​​$ C上的 HTTP://aspnet.$c$cplex.com ,我无法找到 DropDownListFor

解决方案

您必须下载源code ,你会发现里面的DropDownListFor帮手实施<$c$c>mvc3-rtm-sources.zip\\mvc3-rtm-sources\\mvc3\\src\\SystemWebMvc\\Mvc\\Html\\SelectExtensions.cs.要启用客户端验证,你必须发出HTML5的下拉数据 - *属性了。这是通过调用 htmlHelper.GetUnobtrusiveValidationAttributes 方法对 SelectInternal 方法的最后完成。

 &LT;扩展()&GT;
公共职能AutoCompleteDropDownList(BYVAL帮手作为的HtmlHelper,名称作为字符串,autoCompleteSelectListItem方式列表(中AutoCompleteSelectListItem),htmlAttributes作为对象)作为MvcHtmlString
    昏暗selectBuilder作为新TagBuilder(选择)
    selectBuilder.MergeAttribute(名,名称)
    selectBuilder.MergeAttributes(新RouteValueDictionary(htmlAttributes))
    selectBuilder.MergeAttribute(自动校正,关)
    selectBuilder.MergeAttribute(自动完成,关闭)    昏暗selectListBuilder作为新TagBuilder(选项)
    selectListBuilder.MergeAttribute(价值,)
    selectListBuilder.MergeAttribute(选择,入选)    昏暗innerHtmlBuilder作为新的StringBuilder
    innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
    每个项目在autoCompleteSelectListItem
        selectListBuilder =新TagBuilder(选项)
        selectListBuilder.MergeAttribute(值,item.Value)
        selectListBuilder.MergeAttribute(数据替代拼写,item.AlternativeSpellings)
        selectListBuilder.MergeAttribute(数据关联助推器,item.RelevancyBooster)
        selectListBuilder.InnerHtml = item.Label
        innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
    下一个    selectBuilder.InnerHtml = innerHtmlBuilder.ToString()
    selectBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(名))    返回MvcHtmlString.Create(selectBuilder.ToString(TagRenderMode.Normal))
结束功能


更新:

由于在评论部分的要求,这里的帮手一个强类型版本怎么会是这样的:

 &LT;扩展()&GT;
公共职能AutoCompleteDropDownListFor(中的TModel,TProperty)(辅助作为的HtmlHelper(中的TModel),前pression为Ex pression(中Func键(中的TModel,TProperty)),autoCompleteSelectListItem方式列表(中AutoCompleteSelectListItem),htmlAttributes作为对象)作为IHtmlString
    昏暗的名字=前pressionHelper.GetEx pressionText(如pression)
    昏暗fullHtmlFieldName作为字符串= helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(名)    昏暗的selectBuilder =新TagBuilder(选择)
    selectBuilder.MergeAttribute(名,fullHtmlFieldName)
    selectBuilder.MergeAttributes(新RouteValueDictionary(htmlAttributes))
    selectBuilder.MergeAttribute(自动校正,关)
    selectBuilder.MergeAttribute(自动完成,关闭)    昏暗的selectListBuilder =新TagBuilder(选项)
    selectListBuilder.MergeAttribute(价值,)
    selectListBuilder.MergeAttribute(选择,入选)    昏暗innerHtmlBuilder =新的StringBuilder()
    innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))    每个项目在autoCompleteSelectListItem
        selectListBuilder =新TagBuilder(选项)
        selectListBuilder.MergeAttribute(值,item.Value)
        selectListBuilder.MergeAttribute(数据替代拼写,item.AlternativeSpellings)
        selectListBuilder.MergeAttribute(数据关联助推器,item.RelevancyBooster)
        selectListBuilder.InnerHtml = item.Label
        innerHtmlBuilder.Append(selectListBuilder.ToString(TagRenderMode.Normal))
    下一个    selectBuilder.InnerHtml = innerHtmlBuilder.ToString()
    selectBuilder.MergeAttributes(helper.GetUnobtrusiveValidationAttributes(名))    返回MvcHtmlString.Create(selectBuilder.ToString(TagRenderMode.Normal))
结束功能

I'm rockin my own custom HtmlHelper to enable AutoComplete support on a Select List.

This is working alright, except I need to be able to support the DataAnnotations in my ViewModel.

Here's my current (working) HtmlHelper (sans validation)

    <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

How would one rewrite this to support validation? Something like AutoCompleteDropDownListFor()

PS: a C# solution is perfectly acceptable, the project I'm working on is in VB, but I don't mind translating.


PS: I'm flipping through the source code on http://aspnet.codeplex.com and I can't find any reference to DropDownListFor

解决方案

You will have to download the source code and you will find the implementation of the DropDownListFor helper inside mvc3-rtm-sources.zip\mvc3-rtm-sources\mvc3\src\SystemWebMvc\Mvc\Html\SelectExtensions.cs. To enable client side validation you have to emit HTML5 data-* attributes on the drop down. This is done towards the end of the SelectInternal method by calling htmlHelper.GetUnobtrusiveValidationAttributes method.

<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


UPDATE:

As requested in the comments section, here's how a strongly typed version of the helper would look like:

<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

这篇关于与验证支持自定义的HtmlHelper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆