传递参数给用户控件

3
我们在尝试本地化我们的用户控件,基本上我们想要像这样做:
<in:Banner runat="server" ID="banners" Lang="fr" />

我们实现这个的方式是按页面级别发送给主控,然后再由主控发送。
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="<%= Lang%>"吗? - NickGPS
如果广告控件位于母版页中,请采用Freddys有关UI文化的想法。页面生命周期在此处是您的敌人,加载事件发生的时间不正确,无法设置您的横幅广告。 - Mark Dickinson
2个回答

1

您可以在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及以上版本。


1

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

无论如上所述,为什么不将 UI 文化设置为 asp.net 线程(可能来自 global.asax),并从控件中使用它。

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


不太确定页面是否是主页中的控件。更像是继承,这就是为什么要指定主类型。不过我同意 UI 文化建议。 - Mark Dickinson
听起来是个好主意,不过我得看看那个。从页面传递Lang似乎更容易一些。 - Erick
1
你能为单个控件指定UICulture吗? 如果可以在应用程序级别之外的各种层面上应用它,那将会很有趣。 - NickGPS
@Mark,你说得对,这就是我说的不完全一样的地方——我发现主页面有一些奇怪的行为,而我找到的最简单的思考方式就是这样。具体来说,主页面中的控件被合并到内容页面控件层次结构中,因此主页面中的内容最终起到了内容页面的容器作用。我曾经认为可能是内容页面和主页面的加载(由于某种原因我曾经持有这种想法),但这里的信息表明情况并非如此:http://msdn.microsoft.com/en-us/library/dct97kc3.aspx ... - eglasius
@Erick 在使用我上面的分析之前,你可能需要验证一下我的说法 - 即检查哪个负载被首先调用。尽管上述想法是有意义的,但你需要确保你追求正确的行为。你在自定义横幅中如何使用语言? - eglasius
@NickGPS,那是为了整个请求,并且需要在请求生命周期的早期进行设置。如果您的应用程序某些部分不想本地化,只需不向特定语言资源文件添加这些部分的文本即可。 - eglasius

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