【问题标题】:Error on String.FormatString.Format 错误
【发布时间】:2013-09-13 12:57:07
【问题描述】:

我收到“对象引用未设置为对象的实例”。 “welcome.Text = ....”行出现错误

首页:

protected void OKButton_Click(object sender, EventArgs e)
{
    if (UserNameTextBox.Text != String.Empty)
    {
        Session["UserName"] = UserNameTextBox.Text;
        Label welcome = (Label)Master.FindControl("GreetingLabel");
        welcome.Text = String.Format("Welcome, {0}!", Session["UserName"]);
    }
}

<%@ Page Title="" Language="C#" MasterPageFile="~/Professional.master" AutoEventWireup="true" CodeFile="Home.aspx.cs" Inherits="Home"%>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" Runat="Server">
    <br /><br />
    <asp:TextBox ID="UserNameTextBox" runat="server"></asp:TextBox>
    <br /><br />
    <asp:DropDownList ID="SitePrefDropDownList" runat="server" AutoPostBack="True">
        <asp:ListItem Text="Professional" Value="Professional"></asp:ListItem>
        <asp:ListItem Text="Colourful" Value="Colourful"></asp:ListItem>
    </asp:DropDownList>
    <br /><br />
    <asp:Button ID="OKButton" runat="server" Text="OK" onclick="OKButton_Click" />

</asp:Content>

我从 MCTS Exam 70-515 Web Dev book 中获得了代码。

我查看了勘误表页面,没有运气。 http://oreilly.com/catalog/errataunconfirmed.csp?isbn=9780735627406

母版页:

public partial class Professional : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["UserName"] != null)
        {
            GreetingLabel.Text = String.Format("Welcome, {0}!", Session["UserName"]);
        }
    }
}

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Professional.master.cs" Inherits="Professional" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

    <asp:ContentPlaceHolder id="HeadContent" runat="server">
    </asp:ContentPlaceHolder>

<link href="~/Styles/Site.css" rel="Stylesheet" type="text/css" />

</head>
<body>
    <form id="form1" runat="server">
    <div>

        <img src="Contoso.gif"  /><asp:Label ID="Label1" runat="server" Text="Welcome to Contoso!" 
                Font-Size="X-Large"></asp:Label>



        &nbsp;<asp:Menu ID="Menu1" runat="server" Orientation="Horizontal">
            <Items>
                <asp:MenuItem Text="Products" Value="Products"></asp:MenuItem>
                <asp:MenuItem Text="Services" Value="Services"></asp:MenuItem>
                <asp:MenuItem Text="Downloads" Value="Downloads"></asp:MenuItem>
                <asp:MenuItem Text="About Us" Value="About Us"></asp:MenuItem>
            </Items>
        </asp:Menu>



        <asp:ContentPlaceHolder id="MainContent" runat="server">

            <asp:Label ID="GreetingLabel" runat="server" Text="Label"></asp:Label>

        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

问候 低频

【问题讨论】:

  • GreetingLabel 控件在主控中的位置在哪里?如果它在 ContentPlaceHolder 中,则 NamingContainer 不是主人。
  • 你能调试一下,那个 Session["UserName"] 里有什么?
  • Tim:它在 Master 中。在
  • @TimSchmelter 和 ValidfroM 都有道理。在该行设置断点并检查两者中的哪一个为空。
  • ValidfromM:一个名字“LF”

标签: asp.net


【解决方案1】:

GreetingLabel 控件在主控中的什么位置?如果它在ContentPlaceHolder 中,那么NamingContainer 不是主人。

你:“它在一个Master下”:

<asp:ContentPlaceHolder id="MainContent" runat="server">

就是这样,你首先要找到ContentPlaceHolder,然后使用FindControl就可以了:

var cPlaceHolder = (ContentPlaceHolder)Master.FindControl("MainContent");
Label welcome = (Label)cPlaceHolder.FindControl("GreetingLabel");

现在您不再在 welcome.Text 上获得 NullReferenceException

welcome.Text = String.Format("Welcome, {0}!", Session["UserName"]);

编辑 既然您已经评论说它仍然无法正常工作,无论出于何种原因。我会建议一种不同的——更好的——方法。在您的 Master 中提供公共属性,例如 Greeetings。然后你可以通过这个属性获取/设置Label.Text。这更具可读性和可维护性。即使您将标签更改为 TextBoxDiv 等其他控件,它也可以工作。

例如(在Professional 类型的MasterPage 中):

public string Greetings
{
    get { return GreetingLabel.Text;  }
    set { GreetingLabel.Text = value; }
}

现在您可以将内容页面中的 Master 属性转换为 Professional 以访问它:

Professional professional = (Professional) this.Master;
professional.Greetings = String.Format("Welcome, {0}!", Session["UserName"]);

【讨论】:

  • @user2776489:你有没有看到我已经修改了我的代码以使用FindControl("MainContent") 而不是FindControl("ContentPlaceHolder1")?但是,您必须使用ContentPlaceHolder 的正确ID。但是你应该给我们看一下master的aspx代码。
  • @user2776489:编辑了我的答案。
  • Tim:在主帖上查看我的 cmets。
【解决方案2】:

试试这个:

看到这个

welcome.Text = String.Format("Welcome, {0}!", Session["UserName"]);// replace Session["UserName"] with Session["UserName"].ToString()

现在你的新行是

welcome.Text = String.Format("Welcome, {0}!", Session["UserName"].ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多