簡體   English   中英

無法在控件屬性中使用代碼塊

[英]Can't use codeblock in control property

抽象問題:我試圖將用戶在文本字段中的輸入限制為與列的數據庫長度相同。 因此,我想在html輸入上設置maxlength屬性,並且maxlength應該與數據庫中允許的最大長度相同。 可以在整個前端對這些常量進行硬編碼,但是我試圖動態設置該值。

問題:telerik RadComboBox無法接受ASP代碼塊來設置屬性。 異常如下:

解析器錯誤

描述 :在解析服務於此請求所需的資源期間發生錯誤。 請查看以下特定的解析錯誤詳細信息,並適當地修改您的源文件。

解析器錯誤消息 :無法從其字符串表示形式'<%Utility.GetColumnMaxLength <Portfolio>(x => x.Title)%>'為'MaxLength'屬性創建類型為'System.Int32'的對象。

我創建了一個新的最小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; }
    }
}

可能的解決方法:使用ASP.NET表達式 (在<%$ ... %>代碼塊),建立執行代碼,所概述的一般表達式這里

添加對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) %>" >

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM