2010-04-27 39 views
5

Ich habe diese Benutzersteuerung:Pass Parameter an eine Benutzersteuerung - asp.net

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

Sie können sehen, dass ich in der Produkt- und Kategorie füllen durch zwei Methoden aufrufen:

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

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

I verstehe nicht, warum, in der Benutzerkontrolle, wenn ich die empfangenen Daten (Produkt und Kategorie) nehme ich "<% = getProductId()%>" statt die ID von dieser Methode erhalten ...

Jede Hilfe wäre freundlich geschätzt ...

bearbeiten: Gelöst mit: product = '<% # getProductId()%>'

Letztes Problem: in der Benutzerkontrolle Ich habe diese:

Also, ich erwarte, dass die ProductId ok in der Benutzersteuerung eingerichtet ist. Leider ist es null, wenn ich versuche, es zu benutzen ...

Ist irgendetwas, das ich schrieb, das ist falsch?

+0

Haben Sie versucht, productId auf etwas in Ihrer Hauptmethode zu setzen? – 5arx

+0

Denken Sie daran, 'DataBind();' irgendwo in der Seite aufzurufen, die das Steuerelement hostet ... In 'product =" <% # etwas> "' bedeutet das # einen Databind-Ausdruck. Es wird nicht wirklich 'etwas' aufrufen, bis Sie 'DataBind()' aufrufen ... Üblicherweise im' PageLoad() ', das das Steuerelement hostet. – Jon

Antwort

7

Damit Sie kompilieren Zeit erhalten überprüfen, können Sie Ihren Benutzerkontrolle ein ID geben und setzen dann ihre Product und Category Eigenschaften in C# wie folgt aus:

ASPX:

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

CS:

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

Auch, wie 5arx erwähnt, sobald Sie das ausgefüllt haben, dann wird das Aktualisieren Ihrer Seite das Steuerelement neu laden und Sie werden die Product und Category IDs verlieren. Sie können damit umgehen, indem Viewstate auf die Eigenschaften in Ihrem Benutzersteuerung verwendet wird, wie folgt aus:

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; 
    } 
} 

HINWEIS: ich den Namen der Eigenschaft Gehäuse aktualisiert haben Konvention zu folgen, da es einfach mehr Sinn für mich macht, dass Weg! Persönlich würde ich IDs immer mit ID (zB: ProductID) suffixen, um es von einer Eigenschaft zu unterscheiden, die ein Product Objekt enthält. Weitere Informationen zu Codierungsstandards finden Sie hier: Are there any suggestions for developing a C# coding standards/best practices document?

1

Bitte poste noch mehr von deinem Code?

Ein paar Dinge:

  • productId ist ein Objektverweis (auf ein string Objekt), das bedeutet:

  • , wenn Sie einige intialisation Code zu 'füllen' mit einem String-Referenz schreiben Zu Beginn wird es null sein.

  • Wenn Sie eine Zeichenfolge erstellen, z. string x = new String() x wird eine leere Zeichenfolge, die Sie sich vorstellen können "ohne die Anführungszeichen. (Es ist eine Zeichenfolge, aber es ist leer, da es keine Zeichen enthält).

  • können Sie einfach schreiben return productId; - keine Notwendigkeit, ToString() auf einer Zeichenfolge aufzurufen.

  • Ihre Seite verfügt nicht über einen Out-of-the-Box-Mechanismus zum Speichern von Variablen über Postbacks hinweg. Sie müssen dazu ViewState oder ausgeblendete Formularfelder verwenden.