Не могу использовать кодовый блок в свойстве элемента управления - PullRequest
0 голосов
/ 30 ноября 2018

Абстрактная проблема: я пытаюсь ограничить пользовательский ввод в текстовых полях до той же длины базы данных столбца.Поэтому я хочу установить атрибут maxlength на входе html, и максимальная длина должна совпадать с максимальной длиной, допустимой в базе данных.Я мог бы жестко закодировать эти константы во всем интерфейсе, но я пытаюсь установить это значение динамически.

Проблема: telerik RadComboBox не примет блок кода asp для установки свойства.Исключением является следующее:

Ошибка синтаксического анализатора

Описание : Произошла ошибка при синтаксическом анализе ресурса, необходимого для обслуживания этого запроса.Пожалуйста, просмотрите следующую конкретную информацию об ошибке разбора и измените исходный файл соответствующим образом.

Сообщение об ошибке синтаксического анализатора : Не удается создать объект типа 'System.Int32' из его строкового представления '<% Utility.GetColumnMaxLength <Portfolio>(x => x.Title)%>'для свойства' 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 голосов
/ 30 ноября 2018

Возможный обходной путь: используя Выражения 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) %>" >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...