【问题标题】:Access Masterpage control on a basepage using FindControl使用 FindControl 访问基本页面上的 Masterpage 控件
【发布时间】:2011-10-05 05:17:44
【问题描述】:

我有一个 .NET 4.0 上的 ASP.NET 网站应用程序。有一个 Masterpage 包含所有 aspx 页面的页眉和页脚。内容来自各个 aspx 页面。我有所有 aspx 页面都继承自的 BasePage.cs。

现在解决问题: 我在母版页上有一个 HTML Select 控件,我试图使用下面的代码在 BasePage.cs 中检索其值

string language = ((System.Web.UI.HtmlControls.HtmlSelect)Master.FindControl("cmbLanguage")).Value;

我在 InitializeCulture 方法中使用它,它将设置网站的文化信息。

protected override void InitializeCulture()
{

    string language = ((System.Web.UI.HtmlControls.HtmlSelect)Master.FindControl("cmbLanguage")).Value;

    Thread.CurrentThread.CurrentCulture =
        CultureInfo.CreateSpecificCulture(language);
    Thread.CurrentThread.CurrentUICulture = new
        CultureInfo(language);
    base.InitializeCulture();
}

在调试时,我可以看到 language 变量中设置了预期值。问题是当页面呈现时,aspx 页面的 ContentPlaceHolder 内的内容没有被呈现。

我可以看到是涉及FindControl 的代码是原因,因为如果我将语言设置为字符串,一切都会按预期工作。

string language = "de-DE";

我做错了什么?

更新: 如果 MasterPage 上的 ContentPlaceHolder 上有一些内容,则会呈现它而不是页面 ContentPlaceHolder。

【问题讨论】:

  • MasterPage的ContentPlaceHolder中是否有任何内容(标记)?不会呈现 contentplaceholder 控件中的标记。
  • @AVD:MasterPage 的 ContentPlaceHolder 中没有内容。
  • 忘掉母版页吧,在调用 InitializeCulture 时您无法访问任何控件,因为它们根本不存在。您需要遵循答案中建议的解决方案:cookie,查询字符串值+会话或仅查询字符串值,url重写(www.mysite.com/en/products)

标签: asp.net master-pages findcontrol contentplaceholder


【解决方案1】:

InitializeCulture 甚至在 page life cycle 中的 PreInit 之前被调用,这意味着尚未设置控件,并且该控件的值很可能以空字符串的形式出现。

您可能需要通过 cookie、会话值或其他方法来更改读取文化的方式。我不熟悉这样做,所以我没有很好的建议或最佳实践。

【讨论】:

  • 我可以在调试时看到,该值确实被正确拾取为“de-DE”。即使它返回一个空字符串,为什么页面内容占位符中的内容不会显示出来?我试过了,将语言设置为空字符串,contentplaceholder的内容正确呈现。
【解决方案2】:

正如 Doozer 正确指出的那样,在InitializeCulture 时,控件不太可能设置正确的值。我建议您从请求中的 POST 数据中读取值,并通过一些默认值返回它。例如,

string language = Request.Form[Master.FindControl("cmbLanguage")).UniqueID];
language = string.IsNullOrWhiteSpace(language) ? "de-DE" : language;

【讨论】:

    【解决方案3】:

    为了访问 MasterPage 控件最好使用MasterType 指令。使用时,您将能够以强类型的方式访问母版页。在这种情况下,您将能够像这样在母版页上创建一个属性:

    public string SelectedCulture
    {
        get
        {
            return cmbLanguage.Value
        }
    }
    

    在页面本身上,您将能够运行如下代码:

    protected override void InitializeCulture() {
        string language = this.Master.SelectedCulture;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2013-12-27
      • 1970-01-01
      • 2011-06-29
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多