Настройка imageURL с помощью функции в ASP.NET - PullRequest
2 голосов
/ 19 июля 2010

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

(в файле aspx)

<asp:ImageButton ID="ImageButton1" runat="server" ImageUrl='<%# GetImageDirectory()%>btnRunReport.png'  />

(отделенного кода)

public string GetImageDirectory()
{
    return "~/App_Variants/LBSX/images/";
}

Это второй метод, который я пробовал, в другом я попытался передать изображение в виде строки, и таким образом он вернул бы всю ссылку. Все еще не повезло!

Есть мысли?

Спасибо!

[EDIT] Спасибо за помощь всем. В конце концов после полезных подсказок я нашел рекурсивный фрагмент, который выполнил трюк следующим образом:

private void UpdateImages(Control Parent)
{
    foreach (Control c in Parent.Controls)
    {
        ImageButton i = c as ImageButton;
        if (i != null)
        {
            i.ImageUrl = "~/App_Variants/LBSX/images/" + i.ImageUrl;
        }
        if (c.HasControls())
        {
            UpdateImages(c);
        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    UpdateImages(Page);
    ...

Надеюсь, это поможет кому-то еще.

Приветствия

Ответы [ 3 ]

6 голосов
/ 19 июля 2010

Во-первых, как уже упоминал Захари, вы используете блок кода для привязки данных.

Во-вторых, как вы уже попробовали, использование встроенного выражения (<%= %>) не будет работать и в вашем случае, поскольку вы не можете использовать встроенное выражение для любого свойства тега сервера.

Вместо этого вы можете определить кнопку изображения с использованием синтаксиса HTML, опуская тег runat="server" и использовать встроенное выражение для получения URL-адреса вашего изображения:

<input type="image" src="<%= GetImageDirectory() %>btnRunReport.png" name="image" />

Что делает встроенное выражение, оно вызывает Response.Write() со значением между <%= %> в качестве параметра, например, <%= this.MyVar %> - это Response.Write(this.MyVar).

2 голосов
/ 19 июля 2010

Ваш синтаксис для привязки данных, <% #%>. Если вы просто пытаетесь сделать встроенный C #, вы должны использовать <% =%>.

1 голос
/ 08 января 2014

Я даю вам другое решение. Использовать ExpressionBuilder :

  1. Создать класс, отклоненный от ExpressionBuilder, и переопределить функцию GetCodeExpression

     namespace your.namespace
    {
    public class CustomBuilder : ExpressionBuilder
    {
        public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
        {
            Type type1 = entry.DeclaringType;
            PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name];
            CodeExpression[] expressionArray1 = new CodeExpression[1];
            expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim());
    
            String temp = entry.Expression;
            return new CodeCastExpression(descriptor1.PropertyType, new CodeMethodInvokeExpression(new
           CodeTypeReferenceExpression(base.GetType()), "GenerateLink", expressionArray1));
        }
        public static  String GenerateLink(String link)
        {
            return ConfigurationManager.AppSettings["MediaPath"] + link + "?ver=" + ConfigurationManager.AppSettings["MediaCode"];
        }
    }
    }
    

expressionArray1 - входной массив для функции GenerateLink. Вы можете изменить размер массива в соответствии с количеством входных параметров для вашей функции

2. Зарегистрируйте выражение в webconfig

<system.web>
    <compilation debug="true" targetFramework="4.0" >
      <expressionBuilders>

        <add expressionPrefix="GenLink" type="your.namespace.CustomBuilder"/>
      </expressionBuilders>

    </compilation>

3.Вы можете использовать новое выражение:

<asp:ImageButton ID="ImageButton1" runat="Server" ImageUrl='<%$ GenLink:images/magnifier.jpg %>'/>

4. Наслаждайтесь !!!

...