c#从逻辑层访问母版页中的元素

本文关键字:母版页 元素 访问 | 更新日期: 2023-09-27 18:13:21

我有一个内容页连接到一个母版页。我可以访问母版页上的元素,并通过调用站点母版上的方法直接从内容页.cs文件修改它。(这可能是人们在这类领域最常见的错误)

我的问题是,我想扩展这个功能,从一个AJAX请求更新网站主页。ajax文件调用一个不同的页面,该页面依次启动逻辑层的一个实例,我使用该实例进行所有计算和连接。我想做的是直接从逻辑层访问站点管理员(只有一个。cs文件)。

我的当前代码是:

SiteMaster sm = new SiteMaster();
sm.MyMethod("param1", "param2");

这成功地访问了站点主机中名为"MyMethod"的方法,但在该方法中,我有以下代码:

mySpan.InnerText = "this is a test";

不工作,因为我得到"对象引用未设置为对象的实例...."错误。这是因为mySpan是NULL。如果我用this.mySpan. innertext来调用它,如果我把鼠标悬停在"this"上面,我就可以看到ID "mySpan"。

有谁知道我该如何解决这个问题?我所做的每一次搜索都是关于那些想要访问内容页中已经为我工作的元素的人。

c#从逻辑层访问母版页中的元素

我相信你在这里有一个误解。如果我没理解错的话,你有一个主页。在那个aspx页面上,你正在做一个ajax调用(可能是对WebService),它做的事情像:

[WebMethod]
public void UpdateText(string message)
{
  var master = new SiteMaster();
  master.mySpan.Text = message;
}

这里有几处错误。

当你在一个aspx页面上使用这个方法时,你正在更新这个页面的母版。例如:

public void OnSomeRandomButtonClick(object sender, EventArgs e)
{
  ((SiteMaster)this.Page.Master).mySpan.Text = "Some Text";
}

你在这里做的是在母版页被发送到浏览器之前更新它的跨度。另一个微妙之处在于,您不是在创建一个新的SiteMaster,而是使用页面现有的Master并将其转换为SiteMaster。

在ajax中不能这样做有几个原因:

  • webservice没有主页
  • 当你发送一个ajax请求时,你的主页已经被创建并发送到浏览器。

所以你的问题变成了我们如何在不发回服务器的情况下更新Master中的span ?

让我们看看你盒子上的html,它看起来像这样:

<html>
  <head>
    <title>My Awesome Page</title>
  </head>
  <body>
    <h1>This is my Awesome Website</h1>
    <span id="mySpan">I'm sure you'll like it</span>
    <div>
      <p>Page Content</p>
    <div>
  </body>
</html>

让我们假设这里的所有内容都是由主机生成的,只有<p>Page Content</p>是您的aspx页面(也会有ASP的负载)。. NET垃圾添加,我们暂时忽略它)。

您想要做的是更新mySpan中的文本而不发送回服务器。你可以通过javascript来实现这一点——完全不要使用ajax !

我假设您正在使用jQuery(主要是因为我对它比普通的旧JS更熟悉)。你已经有了你的span的ID ("mySpan"),所以剩下的就很简单了:

$('#mySpan').html('This is the updated message');

No。您不能简单地构造一个ASP。. NET页面,并使用其state .

ASP。. NET页(以及控件和母版页)是从asp.net内部构造和初始化的。. NET引擎基于为它们提供的标记。例如,在您的母版页的codeBehind中没有mySpan的初始化,它将在根据用户请求调用基于标记生成的代码时构造。

你可以在你的类中定义这个:

protected HtmlGenericControl mySpan;

但是ASP。. NET引擎将编译此标记

<span id="mySpan" style="color:green"></span>

到这个代码:

this.mySpan = new HtmlGenericControl();
this.mySpan.Style.Add("color", "green);

,这就是为什么你可以在代码中使用这个对象。

所以,如果你想从你的业务层使用你的母版页的属性,你有很多选择。最快的实现之一是使Logic类在Session范围内成为单例,将您想要在母版页中使用的值存储到该单例对象中,然后从母版页读取该值。这是你应该做的一个例子,当然它是粗略的。

class Logic
{
   public static Logic Instance
   {
      get
      {
          if (HttpContext.Current.Session["LogicInstance"] == null)
              HttpContext.Current.Session["LogicInstance"] = new Logic();
          return (Logic) HttpContext.Current.Session["LogicInstance"];
      }
   }
   public string TextForSpan {get;}
   // The rest of your implementation
}

不使用分配内部文本的代码,而是写:

Logic.Instance.TextForSpan = "This is my text";

在你的主页里面:

this.mySpan.InnerText = Logic.Instance.TextForSpan;