将参数传递给用户控件 - asp.net

6

我有这个用户控件:

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

你可以看到,我通过调用两个方法来填写产品和类别:
public string getProductId()
{
    return productId.ToString();
}

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

我不明白为什么在用户控件中,当我获取到接收的数据(产品和类别)时,它会给我"<%= getProductId() %>"而不是从该方法接收的id...

非常感谢任何帮助...

编辑:问题已解决:product='<%# getProductId() %>'

最后一个问题:在用户控件中,我有:

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

所以,我期望productId在用户控件中被正确地设置了。不幸的是,当我尝试使用它时,它是null...

我写错了什么吗?


你尝试在主方法中将productId设置为某个值了吗? - immutabl
请记得在承载控件的页面中调用 DataBind();。在 product="<%# something >" 中,# 表示它是一个数据绑定表达式。只有在调用 'DataBind()' 之后才会实际调用 something...通常在承载控件的 PageLoad() 中。 - Jon
2个回答

8
为了让你在编译时检查,你可以为用户控件设置一个ID,然后在C#中设置其ProductCategory属性,例如:

ASPX:

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

CS:

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

此外,正如5arx所提到的那样,一旦你填充了这些内容,刷新页面将重新加载您的控件,您将丢失ProductCategory ID。您可以通过在用户控件中使用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后缀上ID(例如:ProductID),以区分它与包含Product对象的属性。关于编码规范的更多信息,请阅读这里:有关开发C#编码标准/最佳实践文档的建议吗?


1

请发一些你的代码吧?

有几件事情:

  • productId 是一个对象引用(指向一个 string 对象),这意味着:

  • 除非你在开始时编写一些初始化代码来“填充”它以获得一个字符串引用,否则它将是 null

  • 如果你创建一个字符串,例如 string x = new String(),x 将是一个空字符串,你可以认为它是 "" 没有引号。(它一个字符串,但它是空的,因为它里面没有字符)。

  • 你可以直接写 return productId; - 不需要在字符串上调用 ToString()

  • 你的页面没有开箱即用的机制来跨 postback 存储变量。你需要使用 ViewState 或隐藏表单字段来实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接