【问题标题】:Passing parameters to a User Control将参数传递给用户控件
【发布时间】:2010-12-15 12:33:36
【问题描述】:

我们在这里尝试本地化我们的用户控件,基本上我们希望能够做这样的事情:

<in:Banner runat="server" ID="banners" Lang="fr" />

我们这样做的方式是通过页面级别并将其发送给master,然后将其发送给控件:

protected void Page_Load(object sender, EventArgs e)
{
    Master.Lang = "FR";
}

然后在 MasterPage.master 我们做这样的事情:

<in:Banner runat="server" ID="banners" Lang="<%= Lang %>" />

母版页有一个名为 Lang 的公共财产。

在控件中,我们设置了一个包含默认语言的字段和一个设置语言的属性(Lang)。似乎无论我们做什么,当前语言都不会从页面发送到用户控件......有什么帮助吗?

【问题讨论】:

  • 页面渲染时,in:Banner控件如何渲染Lang属性?它看起来还是像 Lang="" 吗?
  • 如果横幅控件在母版页中,请遵循 Freddys 关于 ui 文化的想法。页面生命周期是你的敌人,加载事件发生在错误的时间来设置你的横幅。

标签: c# .net asp.net .net-3.5 user-controls


【解决方案1】:

不完全一样,但您可以将内容页面视为母版页中的控件,因此该页面的页面加载很可能在该用户控件的页面加载之前执行。

不管上述情况,为什么不将 ui 文化设置为 asp.net 线程(可能来自 global.asax),并从控件中使用它。

另一种选择是有一个单独的类来保存当前语言,并公开一个更改事件......这样即使加载方式不同,您也可以确保使用正确的语言 --- 或者有稍后更改语言事件。

【讨论】:

  • 不太确定页面是否是母版页中的控件。它更像是继承,这就是您指定主类型的原因。不过我同意 ui 文化建议。
  • 听起来像是一个想法,我将不得不看看那个,从页面传递 Lang 听起来更容易。
  • 可以为单个控件指定 UICulture 吗?看看它是否可以在应用程序级别以外的各个级别上应用会很有趣。
  • @Mark 你是对的,这就是为什么我说的不完全一样 - 我在母版页中发现了奇怪的行为,而我发现考虑它的最简单方法就是这样。具体来说,母版页中的控件被合并到内容页控件层次结构中,因此母版页中的内容最终充当内容页中的内容的容器。我认为这可能是内容页面的负载与母版页面中的负载(出于某种原因我有这个想法),但这里的信息另有说明:msdn.microsoft.com/en-us/library/dct97kc3.aspx ...
  • @Erick 您可能想使用我上面的分析来验证我的声明 b4 - 即检查首先调用哪个负载。使用上述想法仍然有意义,但是您要确保遵循正确的行为。您如何在自定义横幅中使用该语言?
【解决方案2】:

您可以像这样在 MasterPage 的代码隐藏中访问它

public void SetLanguage(string language)
{
    banners.Lang = language; //banners is an ID reference to your user control.
}

或者在你的标记中我认为你可以这样做

<in:Banner runat="server" ID="banners" Lang='<%# Bind("Lang") %>' />

我应该提到 Bind 在 .Net 2.0 及更高版本中工作。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2012-03-21
    • 2014-03-10
    相关资源
    最近更新 更多