Element.Visible返回false,但在页面上可见

时间:2014-09-17 14:04:34

标签: c# asp.net

我有以下if语句,发生在Page.IsPostBack上,为什么FirstName.Visible,LastName.Visible,EmailAddress.Visible都为false?:

protected void Page_Load(object sender, EventArgs e)
{
    MainLogo.InnerHtml = ModuleEval("HeadlineLandingPage").ToString();
    FillLabelsAndImages();

    if (!Page.IsPostBack) //Page load
    {
        //Some random code here
    }
    else //Submit button load
    {
        MainLogo.InnerHtml = ModuleEval("HeadlineLandingMasterPage").ToString();
            if (FirstName.Visible && LastName.Visible && EmailAddress.Visible) 
            {
                if (detailsResponse.ResponseStatus.Success && detailsResponse.MemberInfo != null)
                {
                     //Random code here
                }
                else
                    HandleWebServiceError(detailsResponse.ResponseStatus);
            }
            else 
            {
            }
    }
}

默认情况下,这些元素是不可见的:

<input type="text" id="FirstName" runat="server" visible="False" />

但是,当某些用户操作发生时,它们将设置为可见:

    FirstName.Visible = true;

当我提交时,这些元素都清晰可见,我不明白为什么asp.net仍然认为它们是隐形的。

3 个答案:

答案 0 :(得分:2)

你是如何改变控制的?

如果你有什么影响

protected void Page_Load(object sender, EventArgs e)
{
    if(FirstName.Visible && LastName.Visible && EmailAddress.Visible) 
    {
        //Code
    }
}

protected void UpdateFirstName(object sender, EventArgs e)
{
    FirstName.Visible = true;
}

您可以使用ASP.NET事件调用更新,例如

<asp:button text="Button!" onclick="UpdateFirstName" runat="server" />

当您单击按钮时,首先调用Page_Load。当Page_Load正在运行时,

FirstName.Visible

无论默认值是什么 - 在这种情况下都是假的。

不幸的是,在Page_Load之前没有办法调用UpdateFirstName。

最好的解决方案是移动你的

if(FirstName.Visible && LastName.Visible && EmailAddress.Visible) 

逻辑到一个不同的函数,可以在UpdateFirstName运行后调用。

答案 1 :(得分:1)

如果设置为visible = false,则通过asp.net控件呈现的元素将不会在页面中呈现。 IE:元素不在输出中。

常规html元素不理解这一点,因此你必须设置style =“display:none”来隐藏它们,同时仍然使它们在DOM /渲染输出中可用。

因此,如果您使用的不是asp.net控件,则在元素上设置值visible =“false”,如您为输入元素显示的那样:

<input type="text" id="FirstName" runat="server" visible="False" />

除了在名为visible的元素上放置一个属性值为False之外,什么都不做。

例如:

如果我将以下内容放在asp.net页面中。

<input id="test" runat="server" />
<asp:TextBox ID="test1" runat="server"></asp:TextBox>

然后在服务器端运行以下命令:

protected void Page_Load(object sender, EventArgs e)
{
    test.Style.Add("display", "none");
    test1.Visible = false;
}

渲染的输出类似于:

<input name="ctl00$FeaturedContent$test" type="text" id="FeaturedContent_test" style="display:none;" />

在渲染输出中没有元素test1的符号。 虽然元素测试在输出中,但它不会在页面上显示为可见元素。

希望有所帮助。

答案 2 :(得分:0)

你试过吗?

if (FirstName.Visible == true && LastName.Visible == true && EmailAddress.Visible ==  true)
{
    //your code here
}

你对一个布尔值的测试,它确实不重要,但它值得一试。根据{{​​3}},.Visible属性&#34;获取或设置一个值,该值指示是否显示控件及其所有子控件。&#34;。所以你获得了价值,但你仍然需要测试该价值。