【问题标题】:Add client side handler from content page to master page control将客户端处理程序从内容页面添加到母版页控件
【发布时间】:2015-03-17 19:33:30
【问题描述】:

我需要一个 ASP.Net 网络表单应用程序中的四个类似页面。所有四个页面都有一个带有下拉列表和两个按钮的标题。我打算为此标题使用母版页,然后为我需要生成的每个不同页面使用内容页面。我的主人是这样的:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Processing.master.cs" Inherits="MyProject.Processing" %>

<!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">
    <link href="../../Stylesheets/Processing.css" type="text/css" rel="stylesheet" />
    <script language="javascript" src="../../Scripts/js/Processing.js" type="text/javascript"></script>
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form id="ProcessingForm" height="100%" runat="server">
        <asp:Label ID="titleLabel" runat="server" class="bold"></asp:Label>
        <asp:Label runat="server" ID="storeLabel" Text="Store:" />
        <asp:ObjectDataSource runat="server" ID="storesDataSource" TypeName="MyProject.Processing"
            SelectMethod="GetStoresDataSource">
            <SelectParameters>
                <asp:QueryStringParameter Name="UserName" QueryStringField="eUserName" DefaultValue="" />
            </SelectParameters>
        </asp:ObjectDataSource>
        <asp:DropDownList runat="server" ID="storeDropdown" AutoPostBack="true" OnSelectedIndexChanged="storeDropdown_SelectedIndexChanged"
            AppendDataBoundItems="true" DataSourceID="storesDataSource" DataTextField="Display"
            DataValueField="Number">
            <asp:ListItem />
        </asp:DropDownList>
        <asp:Button ID="refreshButton" runat="server" Text="Refresh" OnClick="refreshButton_Click" />
        <%-- ************************************************************************************--%>
        <%-- This is the button that I want to add client side behaviour to from my content pages--%>
        <%-- ************************************************************************************--%>
        <asp:Button ID="processButton" runat="server" Text="Process" OnClick="processButton_Click"
            OnClientClick="DoStuff();" />
        <asp:ContentPlaceHolder ID="GridDiv" runat="server" /> 
    </form>
</body>
</html>

在 Processing.master.cs 中,我定义了一个事件,内容页面可以订阅以在下拉列表更改时做出反应:

public delegate void StoreChangedHandler(object sender, string selectedValue);
public event StoreChangedHandler OnStoreChanged;

protected void storeDropdown_SelectedIndexChanged(object sender, EventArgs e)
{
    if (OnStoreChanged != null)
    {
        OnStoreChanged(sender, ((DropDownList)sender).SelectedValue);
    }
}

所以内容页面的 OnLoad 包含:

protected void Page_Load(object sender, EventArgs e)
{
    ((Processing)Master).OnStoreChanged += StockRoomWithMaster_OnSomethingSelected;
}

void StockRoomWithMaster_OnSomethingSelected(object sender, string selectedValue)
{
    this.stockReceiptGridView.DataBind();
}

对于单击 processButton 控件时发生的客户端 DoStuff() 函数调用,执行此相同策略的最佳方法是什么?我可以在 Processing.js 文件中声明一个全局变量,并在内容页面中将其分配给一个函数:

Processing.js:

var processButtonClickedHandler;

function DoStuff()
{
    if (processButtonClickedHandler) {
        processButtonClickedHandler();
    }
}

在内容页面中:

$(document).ready(function() {
    processButtonClickedHandler = DoSpecificStuff;
});

function DoSpecificStuff() {
    // Custom page client side stuff
}

【问题讨论】:

    标签: javascript asp.net events master-pages content-pages


    【解决方案1】:

    我认为你这样做的方式是最好的方式。我创建了一个测试 bu,以与您相同的方式在 DoSpecificStuff 中发出警报,并且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多