C# 如何在服务器端集中和重定向asp:菜单的WebForm MenuItem链接?

C# 如何在服务器端集中和重定向asp:菜单的WebForm MenuItem链接?,c#,asp.net,sql-server,tsql,ado.net,C#,Asp.net,Sql Server,Tsql,Ado.net,当我按下进入add_sellinvoice时,它会将我重定向到另一个页面add_purchaseinvoice,我希望它通过将我重定向到所需页面来高效运行 背后的代码是: protected void Page_Load(object sender, EventArgs e) { } protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) { if(e.Item

当我按下进入
add_sellinvoice
时,它会将我重定向到另一个页面
add_purchase
invoice,我希望它通过将我重定向到所需页面来高效运行

背后的代码是:

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
    {
        if(e.Item.Value=="add_client")
        {
            Response.Redirect("Add_Client.aspx");
        }
        else if(e.Item.Value=="delete_client")
        {
            Response.Redirect("Delete_client.aspx");
        }
        else if (e.Item.Value == "update_client")
        {
            Response.Redirect("Update_client.aspx");
        }
        else if (e.Item.Value == "retrieve_client")
        {
            Response.Redirect("Retreive_clientbyname.aspx");
        }

        else if(e.Item.Value=="add_invoice")
        {
            Response.Redirect("add_purchinvoice.aspx");
        }

        else if (e.Item.Value == "delete_invoice")
        {
            Response.Redirect("delete_purchinvoice.aspx");
        }

        else if (e.Item.Value == "update_invoice")
        {
            Response.Redirect("update_purchinvoice.aspx");
        }

        else if (e.Item.Value == "retreive_invoice")
        {
            Response.Redirect("retireve_purchaseinvoice.aspx");
        }
        else if (e.Item.Value == "add_invoice")
        {
            Response.Redirect("Add_sellinvoice.aspx");
        }
        else if (e.Item.Value == "delete_invoice")
        {
            Response.Redirect("Delete_sellinvoice.aspx");
        }
        else if (e.Item.Value == "update_invoice")
        {
            Response.Redirect("Update_sellinvoice.aspx");
        }
        else if (e.Item.Value == "retrieve_invoice")
        {
            Response.Redirect("retrieve_sellinvoice.aspx");
        }
        else if (e.Item.Value == "add_item")
        {
            Response.Redirect("Add_items.aspx");
        }
        else if (e.Item.Value == "delete_item")
        {
            Response.Redirect("Delete_items.aspx");
        }
        else if (e.Item.Value == "update_item")
        {
            Response.Redirect("Update_items.aspx");
        }
        else if (e.Item.Value == "retrieve_item")
        {
            Response.Redirect("retrieve_items.aspx");
        }
        else if (e.Item.Value == "add_product")
        {
            Response.Redirect("Add_product.aspx");
        }
        else if (e.Item.Value == "delete_pruduct")
        {
            Response.Redirect("delete_product.aspx");
        }
        else if (e.Item.Value == "update_product")
        {
            Response.Redirect("Update_product.aspx");
        }
        else if (e.Item.Value == "retrieve_product")
        {
            Response.Redirect("retrieve_product.aspx");
        }
        else if (e.Item.Value == "add_amount")
        {
            Response.Redirect("Add_amount.aspx");
        }
        else if (e.Item.Value == "delete_amount")
        {
            Response.Redirect("Delete_amount.aspx");
        }
        else if (e.Item.Value == "update_amount")
        {
            Response.Redirect("Update_amount.aspx");
        }
        else if (e.Item.Value == "retrieve_amount")
        {
            Response.Redirect("retrieve_amount.aspx");
        }
        else if (e.Item.Value == "add_supplier")
        {
            Response.Redirect("Add_Supplier.aspx");
        }
        else if (e.Item.Value == "delete_supplier")
        {
            Response.Redirect("Delete_supplier.aspx");
        }
        else if (e.Item.Value == "update_supplier")
        {
            Response.Redirect("update_supplier.aspx");
        }
        else if (e.Item.Value == "retrieve_supplier")
        {
            Response.Redirect("retrieve_supplier.aspx");
        }
        else if (e.Item.Value == "add_prices")
        {
            Response.Redirect("add_costprice.aspx");
        }
        else if (e.Item.Value == "delete_prices")
        {
            Response.Redirect("delete_costprice.aspx");
        }
        else if (e.Item.Value == "update_prices")
        {
            Response.Redirect("Update_costprice.aspx");
        }
    }

    protected void Home_LinkButton_Click(object sender, EventArgs e)
    {
        Response.Redirect("Home Page.aspx");
    }
}
显示我的菜单的.aspx Webform代码是:

<table class="menutable">
        <tr>    
        <td class="menutd">
           <asp:Menu ID="Menu1" runat="server" 
        DynamicEnableDefaultPopOutImage="false"
        StaticEnableDefaultPopOutImage="false"
        Orientation="Horizontal"
        StaticMenuItemStyle-CssClass="staticmenustyle"
        DynamicMenuItemStyle-CssClass="dynamicmenustyle" OnMenuItemClick="Menu1_MenuItemClick">
      <Items> 
          <asp:MenuItem Text="Client" Value="m1">
                <asp:MenuItem Text="Add Client" Value="add_client"></asp:MenuItem>
                <asp:MenuItem Text="Delete Client" Value="delete_client"></asp:MenuItem>
                <asp:MenuItem Text="Update Client" Value="update_client"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Client" Value="retrieve_client"></asp:MenuItem>
          </asp:MenuItem>
            <asp:MenuItem Text="Invoices" Value="m2">

               <asp:MenuItem Text="sellinvoice" Value="x1">
                    <asp:MenuItem Text="Add Invoice" Value="add_invoice"></asp:MenuItem>
                <asp:MenuItem Text="Delete Invoice" Value="delete_invoice"></asp:MenuItem>
                <asp:MenuItem Text="Update Invoice" Value="update_invoice"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Invoice" Value="retrieve_invoice"></asp:MenuItem>
                   </asp:MenuItem>
            <asp:MenuItem Text="purchaseinvoice" Value="x2">
                       <asp:MenuItem Text="Add Invoice" Value="add_invoice"></asp:MenuItem>
                <asp:MenuItem Text="Delete Invoice" Value="delete_invoice"></asp:MenuItem>
                <asp:MenuItem Text="Update Invoice" Value="update_invoice"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Invoice" Value="retrieve_invoice">    
            </asp:MenuItem>
                </asp:MenuItem>
                     </asp:MenuItem>
            <asp:MenuItem Text="Items" Value="m3">
                <asp:MenuItem Text="Add Item" Value="add_item"></asp:MenuItem>
                <asp:MenuItem Text="Delete Item" Value="delete_item"></asp:MenuItem>
                <asp:MenuItem Text="Update Item" Value="update_item"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Item" Value="retrieve_item"></asp:MenuItem>
                </asp:MenuItem>
            <asp:MenuItem Text="Product" Value="m4">
                <asp:MenuItem Text="Add Product" Value="add_product"></asp:MenuItem>
                <asp:MenuItem Text="Delete Product" Value="delete_product"></asp:MenuItem>
                <asp:MenuItem Text="Update Product" Value="update_product"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Product" Value="retrieve_product">
                    </asp:MenuItem>
                </asp:MenuItem>
             <asp:MenuItem Text="Amount" Value="m5">
                <asp:MenuItem Text="Add Amount" Value="add_amount"></asp:MenuItem>
                <asp:MenuItem Text="Delete Amount" Value="delete_amount"></asp:MenuItem>
                <asp:MenuItem Text="Update Amount" Value="update_amount"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Amount" Value="retrieve_amount"> 
                </asp:MenuItem>
            </asp:MenuItem>

            <asp:MenuItem Text="Supplier" Value="m6">
                <asp:MenuItem Text="Add Supplier" Value="add_supplier"></asp:MenuItem>
                <asp:MenuItem Text="Delete Supplier" Value="delete_supplier"></asp:MenuItem>
                <asp:MenuItem Text="Update Supplier" Value="update_supplier"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Supplier" Value="retrieve_supplier">

                </asp:MenuItem>
            </asp:MenuItem>
          <asp:MenuItem Text="Costs" Value="m7">
                <asp:MenuItem Text="Add Prices" Value="add_prices"></asp:MenuItem>
                <asp:MenuItem Text="Delete Prices" Value="delete_prices"></asp:MenuItem>
                <asp:MenuItem Text="Update Prices" Value="update_prices"></asp:MenuItem>
                <asp:MenuItem Text="Retrieve Prices" Value="retrieve_prices"></asp:MenuItem>
            </asp:MenuItem>
      </Items>
      </asp:Menu>
            </td>       
        </tr>

您看到此问题的原因是您有两个具有相同值的菜单项,并且您没有检查父菜单项的上下文。big
if
语句将找到具有此值的第一个分支,并忽略第二个分支

<asp:MenuItem Text="sellinvoice" Value="x1">
     <asp:MenuItem Text="Add Invoice" Value="add_invoice">
编辑

如果您必须使用集中式服务器端链接处理程序,我建议您将代码更改为使用字典进行映射:

    private static readonly IDictionary<string, string> MenuLinks = 
         new Dictionary<string, string>
    {
        {"add_client", "Add_Client.aspx"},
        {"delete_client", "Delete_client.aspx"},
        {"add_invoice", "add_purchinvoice.aspx"},
        {"add_invoice", "Add_sellinvoice.aspx"}, // *** Error!
        // ...
    };

    protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
    {
        string redirectLink;
        if (MenuLinks.TryGetValue(e.Item.Value, out redirectLink))
        {
            // Avoid the thread abort exception of a response.redirect by making sure this is the last action in the page lifecycle
            Response.Redirect(redirectLink, false);
        }
        else
        {
            txtErrorMessage.Text = "Please select a Link";
        }
    }   
专用静态只读IDictionary菜单项=
新词典
{
{“add_client”,“add_client.aspx”},
{“delete_client”,“delete_client.aspx”},
{“添加发票”、“添加purchinvoice.aspx”},
{“add_invoice”,“add_sellinvoice.aspx”},//***错误!
// ...
};
受保护的无效菜单1\u菜单单击(对象发送者,菜单目标e)
{
字符串重定向链接;
if(MenuLinks.TryGetValue(e.Item.Value,out-redirectLink))
{
//通过确保这是页面生命周期中的最后一个操作,避免response.redirect的线程中止异常
Response.Redirect(redirectLink,false);
}
其他的
{
txtErrorMessage.Text=“请选择一个链接”;
}
}   
它不仅可以为您节省大量杂乱的if/switch语句,而且在检测到重复密钥时还会出现一个硬错误:

已添加具有相同密钥的项


为什么不直接使用的
navigateurl
属性-菜单中的链接真的需要一个集中的“路由器”吗?
<asp:Menu ID="Menu1" runat="server"
    DynamicEnableDefaultPopOutImage="false"
    StaticEnableDefaultPopOutImage="false"
    Orientation="Horizontal"
    StaticMenuItemStyle-CssClass="staticmenustyle"
    DynamicMenuItemStyle-CssClass="dynamicmenustyle"> <%--No MenuItemClick--%>

    <Items>
        <asp:MenuItem Text="Client" NavigateUrl="foo.aspx">
            <asp:MenuItem Text="Add Client" NavigateUrl="bar.aspx">
                <asp:MenuItem Text="Delete Client" NavigateUrl="baz.aspx"></asp:MenuItem>
            </asp:MenuItem>
            <asp:MenuItem Text="Delete Client" NavigateUrl="foo2.aspx"></asp:MenuItem>
        </asp:MenuItem>
    </Items>
</asp:Menu>
    private static readonly IDictionary<string, string> MenuLinks = 
         new Dictionary<string, string>
    {
        {"add_client", "Add_Client.aspx"},
        {"delete_client", "Delete_client.aspx"},
        {"add_invoice", "add_purchinvoice.aspx"},
        {"add_invoice", "Add_sellinvoice.aspx"}, // *** Error!
        // ...
    };

    protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
    {
        string redirectLink;
        if (MenuLinks.TryGetValue(e.Item.Value, out redirectLink))
        {
            // Avoid the thread abort exception of a response.redirect by making sure this is the last action in the page lifecycle
            Response.Redirect(redirectLink, false);
        }
        else
        {
            txtErrorMessage.Text = "Please select a Link";
        }
    }