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

时间:2018-11-30 15:45:29

标签: c# asp.net telerik

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

问题:telerik RadComboBox无法接受ASP代码块来设置属性。例外如下:

  

解析器错误

     

说明:在解析服务该请求所需的资源期间发生错误。请查看以下特定的解析错误详细信息,并适当地修改您的源文件。

     

解析器错误消息:无法为其字符串表示形式“ <%Utility.GetColumnMaxLength (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 个答案:

答案 0 :(得分:0)

可能的解决方法:使用ASP.NET Expressions<%$ ... %>代码块),构建执行代码的通用表达式,概述为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) %>" >