抽象问题:我试图将用户在文本字段中的输入限制为与列的数据库长度相同。因此,我想在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; }
}
}
答案 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) %>" >