2010-04-27 3 views
5

У меня есть этот пользовательский элемент управления:параметры пропуском на пользовательский элемент управления - asp.net

<user:RatingStars runat="server" product="<%= getProductId() %>" category="<%= getCategoryId() %>"></user:RatingStars> 

Вы можете увидеть, что я заполняю продукта и категории по телефону два метода:

public string getProductId() 
{ 
    return productId.ToString(); 
} 

public string getCategoryId() 
{ 
    return categoryId.ToString(); 
} 

I не понимаю, почему в пользовательском контроле, когда я беру полученные данные (товар и категория), он дает мне «<% = getProductId()%>» вместо того, чтобы давать идентификатор, полученный от этого метода ...

Любая помощь будет любезно оценил ...

Редактировать: решаемые с: продукт = '<% # getProductId()%>'

Последняя проблема: в пользовательский элемент управления У меня есть это:

public string productId; 
public string product 
{ 
    get 
    { 
     return productId; 
    } 
    set 
    { 
     productId = value; 
    } 
} 

Итак, я ожидаю, что productId настроен нормально в пользовательском элементе управления. К сожалению, это недействительно, когда я пытаюсь его использовать ...

Есть что-то, что я написал неправильно?

+0

Вы пробовали задавать продукт, если что-то сказать своим основным методом? – 5arx

+0

Не забудьте вызвать 'DataBind();' где-то на странице, где находится элемент управления ... В 'product =" <% # something> "', # означает его выражение в виде строки. Он фактически не называет 'something', пока вы не назовете« DataBind() »... Обычно в' PageLoad() 'размещается элемент управления. – Jon

ответ

7

Так что вы получите во время компиляции проверки, вы можете дать свой контроль пользователю ID, а затем установить его Product и Category свойства в C# как это:

ASPX:

<user:RatingStars id="myUserControlID" runat="server" Product="<%= getProductId() %>" Category="<%= getCategoryId() %>"></user:RatingStars> 

CS:

myUserControlID.Product = GetProductId(); 
myUserControlID.Category = GetCategoryId(); 

Кроме того, как указано в 5arx, после того, как вы заселили, тогда обновление вашей страницы перезагрузит ваш элемент управления, и вы потеряете ID Product и Category. Вы можете справиться с этим с помощью ViewState на свойства в вашем пользовательском элементе управления, например:

private const string ProductKey = "ProductViewStateKey"; 
public string Product 
{ 
    get 
    { 
     if (ViewState[ProductKey] == null) 
     { 
       // do whatever you want here in case it's null 
       // throw an error, return string.empty or whatever 
     } 
     return ViewState[ProductKey].ToString(); 
    } 

    set 
    { 
     ViewState[ProductKey] = value; 
    } 
} 

Примечание: Я обновил имя свойства корпуса, чтобы следовать конвенции, так как она просто делает больше смысла для меня, что путь! Лично у меня всегда были суффиксные идентификаторы с ID (например: ProductID), чтобы отличить его от свойства, содержащего объект Product. Подробнее о стандартах кодирования читайте здесь: Are there any suggestions for developing a C# coding standards/best practices document?

1

Пожалуйста, разместите еще свой код?

Пара вещей:

  • productId является ссылкой на объект (на string объекта), что означает:

  • , если вы не напишете некоторый intialisation код «заполнить» его со ссылкой строки в начале, это будет null.

  • если вы создаете строку, например. string x = new String() x будет пустая строка, которую вы можете представить как "" без котировок. (Это - строка, но ее пустая, потому что в ней нет символов).

  • Вы можете просто написать return productId; - не нужно звонить ToString() на строку.

  • На вашей странице нет встроенного механизма для хранения переменных по обратной стороне. Для этого вам нужно использовать ViewState или скрытые поля формы.
Смежные вопросы