【问题标题】:ASP .NET expressions (inline tag) with String.Format带有 String.Format 的 ASP .NET 表达式(内联标记)
【发布时间】:2012-02-21 17:52:59
【问题描述】:

我只是想知道是否可以将String.Format 与以下内联标签一起使用:

<asp:RequiredFieldValidator ControlToValidate="tbTest" Text="<%$ Resources:ErrorMsg, E3032  %>" runat="server" />

喜欢这样

<asp:RequiredFieldValidator ControlToValidate="tbTest" Text='<%= String.Format(<%$ Resources:ErrorMsg, E3032  %>, "Other Text to insert")' runat="server" />

我知道你不能这样做,但这只是为了拍照。

发送

【问题讨论】:

  • 其他要插入的文字不是也需要来自资源文件吗?
  • 好点!但不适用于我正在处理的情况。 :)
  • Resources:ErrorMsg 是否给出格式类型字符串?给我们一个输出的例子。
  • 输出类似于:“{0} 是必需的。”所以我想 String.Format(, "Name") 给我“Name is required”。

标签: asp.net


【解决方案1】:

资源绑定语法仅限于接受两个参数:资源容器的名称和资源键。

您可以使用数据绑定

<asp:RequiredFieldValidator 
       ControlToValidate="tbTest" 
       Text='<%# String.Format(
                     Convert.ToString(GetGlobalResourceObject("ErrorMsg", "E3032"), 
                     System.Globalization.CultureInfo.CurrentCulture),
                         "Other Text to insert") %>'
        />

如果控件不是数据绑定控件的子控件,您可能需要调用 tbTest.DataBind()。

【讨论】:

  • 不太喜欢解决方案,因为我不想为每个验证器调用 DataBind()。不妨从代码隐藏中做所有事情,但后来我在 page_load 中尝试了 Page.DataBind() 并且它起作用了。凉爽的。只是希望它不会干扰其他数据绑定控件。
【解决方案2】:

我最终为此创建了自己的表达式:

web.config:

<expressionBuilders>
  <add expressionPrefix="CreerMsgErreur" type="MsgErreurs, App_Code" /> 
</expressionBuilders>

.aspx:

<asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="tbdDateFin"
 CssClass="test" Text="<%$ CreerMsgErreur:E3033, insert, date %>"
 ErrorMessage="<%$ CreerMsgErreur:E3033, insert, date %>"
 runat="server" EnableClientScript="true" SetFocusOnError="true" />

.vb:

Imports System
Imports System.CodeDom
Imports System.Linq
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.Compilation
Imports System.Web.UI

<ExpressionPrefix("Reflect")> _
<AspNetHostingPermission(SecurityAction.InheritanceDemand, Level:=AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermission(SecurityAction.LinkDemand, Level:=AspNetHostingPermissionLevel.Minimal)> _
Public Class MsgErreurs
    Inherits ExpressionBuilder

    Public Overrides Function GetCodeExpression(ByVal entry As System.Web.UI.BoundPropertyEntry, ByVal parsedData As Object, ByVal context As System.Web.Compilation.ExpressionBuilderContext) As System.CodeDom.CodeExpression
        If parsedData IsNot Nothing Then
            Return New CodePrimitiveExpression(CType(parsedData, MsgErreursParse).ToString())
        End If

        Return New CodePrimitiveExpression("Erreur de l'expression")
    End Function

    Public Overrides Function ParseExpression(ByVal expression As String, ByVal propertyType As System.Type, ByVal context As System.Web.Compilation.ExpressionBuilderContext) As Object

        Dim leMsgErreur As MsgErreursParse = Nothing

        If Not String.IsNullOrEmpty(expression) Then
            leMsgErreur = New MsgErreursParse(expression)
        Else
            Throw New HttpException(String.Format("Message de l'expression MsgErreur vous devez entrer une expression."))
        End If

        Return leMsgErreur
    End Function

    Private Class MsgErreursParse
        Private mNoErreur As String
        Private mParametres As String

        Public Property NoErreur() As String
            Get
                Return mNoErreur
            End Get
            Set(ByVal value As String)
                mNoErreur = value
            End Set
        End Property

        Public Property Parametres() As String
            Get
                Return mParametres
            End Get
            Set(ByVal value As String)
                mParametres = value
            End Set
        End Property

        Public Sub New(ByVal parametres As String)
            Try
                mNoErreur = parametres.Substring(0, parametres.IndexOf(",")).Trim()
                mParametres = parametres.Substring(parametres.IndexOf(",") + 1).Trim()
            Catch ex As ArgumentOutOfRangeException
                mNoErreur = parametres
            Catch ex As Exception

            End Try

            If String.IsNullOrEmpty(mNoErreur) Then
                Throw New HttpException(String.Format("Message de l'expression MsgErreur : vous devez spécifier un code d'erreur ou les paramètres ne sont pas dans le bon format : {0}", parametres))
            End If
        End Sub

        Public Sub New(ByVal noErreur As String, ByVal parametres As String)
            mNoErreur = noErreur
            mParametres = parametres
        End Sub

        Public Overrides Function ToString() As String
            Try
                If String.IsNullOrEmpty(Parametres) Then
                    Return Convert.ToString(HttpContext.GetGlobalResourceObject("MsgErreurs", NoErreur), System.Globalization.CultureInfo.CurrentCulture)
                Else
                    Return String.Format(Convert.ToString(HttpContext.GetGlobalResourceObject("MsgErreurs", NoErreur), System.Globalization.CultureInfo.CurrentCulture), Parametres.Split(",").Select(Function(s) s.Trim()).ToArray())
                End If
            Catch ex As Exception
                Throw New HttpException(String.Format("Message de l'expression MsgErreur : impossible de créer le message d'erreur : NoErreur : {0}, Parametres : {1}", NoErreur, Parametres))
            End Try
        End Function
    End Class

End Class

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2019-08-30
    • 2015-03-17
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多