【问题标题】:Creating a master page in ASP.NET error on markup aspx page在标记 aspx 页面上的 ASP.NET 错误中创建母版页
【发布时间】:2019-05-08 00:15:48
【问题描述】:

我尝试在 ASP.NET 中创建 母版页

我在页面 sDefault.aspxMarkup 上出现此错误,我需要调用 母版页

CS0103: The name 'Base64ForUrlEncode' does not exist in the current context.

为什么我有这个错误? 在 MasterPage.master.cs 我插入了:

public static string Base64ForUrlEncode(string str)
{
    byte[] encbuff = Encoding.UTF8.GetBytes(str);
    return HttpServerUtility.UrlTokenEncode(encbuff);
}

我试过这个solution 没有成功。

如何解决这个问题? 我的代码如下。

这是MasterPage.master.cs

的代码
public partial class MasterPage : System.Web.UI.MasterPage
{    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            InitializeCulture();
        }
    }

    protected void InitializeCulture()
    {
        Page.Culture = "en-US";
        Page.UICulture = "en-US";
    }    

    public static string Base64ForUrlEncode(string str)
    {
        byte[] encbuff = Encoding.UTF8.GetBytes(str);
        return HttpServerUtility.UrlTokenEncode(encbuff);
    }

    public static string Base64ForUrlDecode(string str)
    {
        byte[] decbuff = HttpServerUtility.UrlTokenDecode(str);
        return Encoding.UTF8.GetString(decbuff);
    }    
}

这是MasterPage.master

的代码
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>

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

    <style type="text/css">

        .labelStyle {
            color: red;
            background-color: yellow;
            border: Solid 2px Red;
            margin-left: auto;
            margin-right: auto;
            width: 30em;
            display: block;
            text-align: center;
        }

        .image {
            margin-left: auto;
            margin-right: auto;
        }

        .toUpper {
            text-transform: uppercase;
        }

        .header {
            background-color: #686565;
            font: bold;
            color: #686565;
            text-align: center;
        }
    </style>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.5.2/jquery-ui.min.js"></script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">

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

这是我需要调用母版页的页面 sDefault.aspxMarkup

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="sDefault.aspx.cs" 
    Inherits="sDefault" MasterPageFile="MasterPage.master" %>
    <%@ MasterType  virtualPath="MasterPage.master"%>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

    <asp:GridView ID="gvProducts" 
                  AutoGenerateColumns="False" 
                  EmptyDataText="No data" 
                  EnableViewState="true"
                  runat="server" 
                  DataKeyNames="sID" 
                  HorizontalAlign="Center">
                    <AlternatingRowStyle CssClass="altrows" />
                    <Columns>
                            <asp:TemplateField 
                                 HeaderText="Nr" 
                                 ItemStyle-CssClass="ddl_Class_new" 
                                 ItemStyle-HorizontalAlign="Center">
                                <ItemTemplate>
                                    <asp:HyperLink runat="server"
                                        NavigateUrl='<%#(String.IsNullOrEmpty(Eval("Nr").ToString()) ? "" : 
                      Eval("Nr").ToString().Equals("0") ? "" : 
                      String.Format("sExport1.aspx?d={0}&s={1}",
Base64ForUrlEncode(HttpUtility.UrlEncode(Eval("d").ToString())),
   HttpUtility.UrlEncode(Base64ForUrlEncode("s")))) %>' />
                                </ItemTemplate>
                            </asp:TemplateField>
                    </Columns>
                </asp:GridView>
    </asp:Content>

编辑#1

代码隐藏 Default.asp.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        MasterPage MasterPage = (MasterPage)Page.Master;
        MasterPage.Base64ForUrlEncode(null);
    }
}

编辑#2

代码隐藏 Default.asp.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        MasterPage mp = (MasterPage)Page.Master;
        string test = mp.Base64ForUrlEncode("TestUrl");
    }
}

标记 aspx

<asp:TemplateField>
    <ItemTemplate>
        <%# mp.Base64ForUrlEncode("TestUrl") %>
    </ItemTemplate>
</asp:TemplateField>

MasterPage.master.cs

public string Base64ForUrlEncode(string str)
{
    byte[] encbuff = Encoding.UTF8.GetBytes(str);
    return HttpServerUtility.UrlTokenEncode(encbuff);
}

【问题讨论】:

标签: c# asp.net webforms master-pages


【解决方案1】:

Base64ForUrlEncode 在母版页类 (public partial class MasterPage) 中,而 aspx 页面 sDefault 有它自己的。因此,除非您在 aspx 上指定命名空间,否则无法找到该方法。

<%= YourNameSpace.MasterPage.Base64ForUrlEncode("test")  %>

更新

public MasterPage master;

protected void Page_Load(object sender, EventArgs e)
{
    master = (MasterPage)Page.Master;
    string s = master.Base64ForUrlEncode("test");
}

然后将 Master Public 中的 Base64ForUrlEncode 方法设为非静态

public string Base64ForUrlEncode(string str)
{
}

现在可以直接在aspx上引用了

<ItemTemplate>
    <%# master.Base64ForUrlEncode("TestUrl") %>                   
</ItemTemplate>

【讨论】:

  • 谢谢,但我有错误仅允许直接在包含内容检查的内容页面上使用内容控件。
  • 在另一个控件中使用&lt;%#,例如GridView。
  • 请在我的第一个问题中查看我的 Edit #1。我有同样的错误。
  • 更新了我的答案。
  • 谢谢,现在的错误是:CS0176:无法使用实例引用访问成员;使用类型名称而不是 MasterPage.Base64ForUrlEncode (string) 来限定它
【解决方案2】:

我想参考您的编辑 1:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        MasterPage MasterPage = (MasterPage)Page.Master;
        MasterPage.Base64ForUrlEncode(null);
    }
}

改成:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        MasterPage mp = (MasterPage)Page.Master;
        string test = mp.Base64ForUrlEncode("your test string");
    }
}

如果您只有 1 个字段和/或在后面的代码中引用一个函数来构建 url,您可以将网格更改为中继器。

恕我直言,这逻辑太多了:

<asp:HyperLink runat="server"
               NavigateUrl='<%#(String.IsNullOrEmpty(Eval("Nr").ToString()) ? "" : 
                  Eval("Nr").ToString().Equals("0") ? "" : 
                  String.Format("sExport1.aspx?d={0}&s={1}",
Base64ForUrlEncode(HttpUtility.UrlEncode(Eval("d").ToString())),
   HttpUtility.UrlEncode(Base64ForUrlEncode("s")))) %>' />

(或“在项目数据绑定上”)

【讨论】:

  • 谢谢,现在的错误是:CS0176:无法使用实例引用访问成员;使用类型名称而不是 MasterPage.Base64ForUrlEncode (string) 来限定它
  • 你是如何重构你的TemplateField / ItemTemplate的?
  • 请在我的第一个问题中查看我的 Edit #2。我有同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多