无法在控件属性中使用代码块

Posted

技术标签:

【中文标题】无法在控件属性中使用代码块【英文标题】:Can't use codeblock in control property 【发布时间】:2019-05-02 19:04:36 【问题描述】:

抽象问题:我试图将文本字段中的用户输入限制为与列的数据库长度相同。所以我想在 html 输入上设置一个 maxlength 属性,并且 maxlength 应该与数据库中允许的最大长度相同。我可以在整个前端对这些常量进行硬编码,但我正在尝试动态设置该值。

问题:telerik RadComboBox 不接受 asp 代码块来设置属性。例外情况如下:

解析器错误

说明:解析服务此请求所需的资源时出错。请查看以下特定的解析错误详细信息并适当修改您的源文件。

解析器错误消息:无法从其字符串表示 '(x => x.Title) %>' 创建类型为 'System.Int32' 的对象'MaxLength' 属性。

我创建了一个新的最小 asp.net 项目来复制问题。 default.aspx 源代码(后面没有 .cs 代码):

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TelerikCodeBlock._Default" %>
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<%@ Import namespace="TelerikCodeBlock" %>
<%@ Import namespace="TelerikCodeBlock.DataModel" %>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">

    <telerik:RadComboBox ID="txtboxTitle" runat="server" MaxLength="<% Utility.GetColumnMaxLength<Portfolio>(x => x.Title) %>" >
        </telerik:RadComboBox>

</asp:Content>

Utility 类已最小化为以下内容

namespace TelerikCodeBlock

    public class Utility
    
        public static int GetColumnMaxLength<T>(Expression<Func<T, object>> property)
        
            // looks at Entity Framework metadata in real project ...
            return 3;
        
    

数据模型的样子

namespace TelerikCodeBlock.DataModel

    public class Portfolio
    
        public int Id  get; set; 
        public string Title  get; set; 
    

【问题讨论】:

【参考方案1】:

可能的解决方法:使用ASP.NET Expressions(&lt;%$ ... %&gt; 代码块)构建执行代码的通用表达式,如here 所述。

添加对Microsoft.CodeDom.Providers.DotNetCompilerPlatform的引用。

在某处定义以下内容:

using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Compilation;
using System.Web.UI;

namespace TelerikCodeBlock

    [ExpressionPrefix("Code")]
    public class CodeExpressionBuilder : ExpressionBuilder
    
        public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,
           object parsedData, ExpressionBuilderContext context)
        
            return new CodeSnippetExpression(entry.Expression);
        
    

并在 web.config 中注册

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5" >
      <expressionBuilders>
        <add expressionPrefix="Code" type="TelerikCodeBlock.CodeExpressionBuilder"/>
      </expressionBuilders>
    </compilation>

    ...

现在更改asp控件以使用表达式代码块:

<telerik:RadComboBox ID="txtboxTitle" runat="server" MaxLength="<%$ Code: Utility.GetColumnMaxLength<Portfolio>(x => x.Title) %>" >

【讨论】:

以上是关于无法在控件属性中使用代码块的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF C# 中无法访问用户控件的自定义属性

用户控件依赖属性更新多个控件值

“控件集合无法修改,因为控件包含代码块”

有没有办法以声明方式将代码隐藏属性值传递给服务器控件?

角度错误:无法读取 null 的属性(读取“控件”)

C#textbox控件的不可编辑属性