简体   繁体   中英

Can't use codeblock in control property

The abstract problem: I'm trying to limit user input in text fields to the same as the database length of the column. So I want to set a maxlength attribute on an html input, and the maxlength should be the same as the max length allowed in the database. I could hardcode these constants throughout the frontend, but I'm trying to set that value dynamically.

The problem: telerik RadComboBox won't accept an asp code block to set a property. The exception is as follows:

Parser Error

Description : An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately.

Parser Error Message : Cannot create an object of type 'System.Int32' from its string representation '<% Utility.GetColumnMaxLength<Portfolio>(x => x.Title) %>' for the 'MaxLength' property.

I've created a new minimal asp.net project to duplicate the problem. default.aspx source (no .cs code behind):

<%@ 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>

The Utility class has been minimized to the following

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;
        }
    }
}

Data model looks like

namespace TelerikCodeBlock.DataModel
{
    public class Portfolio
    {
        public int Id { get; set; }
        public string Title { get; set; }
    }
}

Possible workaround: using ASP.NET Expressions (the <%$ ... %> code blocks), build a general expression that executes code, as outlined here .

Add a reference to Microsoft.CodeDom.Providers.DotNetCompilerPlatform .

Define the following somewhere:

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);
        }
    }
}

And register it in the web.config

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

    ...

Now change the asp control to use the expression code block:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM