关于类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内问题的解决方案...

本文详细介绍了在ASP.NET Web应用程序中遇到的Excel导出功能导致LinkButton控件加载异常的问题,并提供了通过重写VerifyRenderingInServerForm方法和修改page指令中的EnableEventValidation属性来解决该问题的解决方案。

1.首先确认LinkButton控件包含在Form中,检查该Form有无runat标记,如果有,排除Form原因,请继续看。

2.如果看到这里,估计你是在做Excel导出功能。在后台代码中重写VerifyRenderingInServerForm方法:

    public override void VerifyRenderingInServerForm(Control control)    

   {        

        // Confirms that an HtmlForm control is rendered for    

   } 

      个人认为,出现此问题的原因是导出Excel时,浏览器响应的类型为context.Response.ContentType=" application/excel " ; 而非常规的"text/html"类型,此时浏览器响应服务器下载Excel,已经"忘 记"当前页面(不知道这么说恰不恰当),只记得响应当前用户的Excel导出请求,故出现LinkButton没有加载在Form中的异常情况。

MSDN对此方法的解释:

必须位于 <form runat=server> 标记中的控件可以在呈现之前调用此方法,以便在控件被置于标记外时显示错误消息。 发送回或依赖于注册的脚本块的控件应该在 Control.Render 方法的重写中调用此方法。 呈现服务器窗体元素的方式不同的页可以重写此方法以在不同的条件下引发异常。

如果回发或使用客户端脚本的服务器控件没有包含在 HtmlForm 服务器控件 (<form runat="server">) 标记中,它们将无法正常工作。 这些控件可以在呈现时调用该方法,以在它们没有包含在 HtmlForm 控件中时提供明确的错误消息。

开发自定义服务器控件时,通常在为任何类型的输入标记重写 Render 方法时调用该方法。 这在输入控件调用 GetPostBackEventReference 或发出客户端脚本时尤其重要。 复合服务器控件不需要作出此调用。

3.小伙伴们可能会发现,重写VerifyRenderingInServerForm后页面依然报错,不过不再报'类型“LinkButton”的控件“xxx”必须放在具有 runat=server 的窗体标记内'这个错了,这是一个好消息。具体错误信息为:只能在执行 Render() 的过程中调用 RegisterForEventValidation(RegisterForEventValidation can only be called during Render();)

解决办法:在前台aspx页面的page指令中添加EnableEventValidation = "false",修改如下:

<%@ Page Language="C#" EnableEventValidation = "false" AutoEventWireup="true" CodeFile="ExportRepeater.aspx.cs" Inherits="ExportRepeater" %>

转载于:https://www.cnblogs.com/the-three/p/3725015.html

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="OnlineSupermarketTuto.Views.Home.Index" %> <!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> <link href="../../bootstrap-5.2.2-dist/bootstrap-5.2.2-dist/css/bootstrap.min.css" rel="stylesheet" /> </head> <body> <form id="form1" runat="server"> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <div class="container-fluid"> <a class="navbar-brand" href="#"/>商城首页</a> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"> <div class="mb-3"> <img src="../../Assets/Images/groceries.png" style="height: 40px; width: 40px"/> <a class="nav-link" href="Cart.aspx">购物车</a> </div> </li> <li class="nav-item"> <div class="mb-3"> <img src="../../Assets/Images/clipboard.png" id="logo" style="height: 60px; width: 60px" /> <a class="nav-link" href="Order.aspx">订单</a> </div> </li> <li class="nav-item"> <div class="mb-3"> <img src="../../Assets/Images/customer-feedback (1).png" id="logo" style="height: 60px; width: 60px" /> <a class="nav-link" href="Profile.aspx">个人首页</a> </div> </li> </ul> </div> </div> </nav> <div class="container mt-4"> <div class="row"> <div class="col-md-4 mb-4"> <div class="card"> <img src="../../素材图片/groceries.png" class="card-img-top" alt="商品图片"> <div class="card-body"> <h5 class="card-title">示例商品</h5> <asp:LinkButton ID="btnAddToCart" runat="server" CssClass="btn btn-primary" OnClick="btnAddToCart_Click">添加购物车</asp:LinkButton> <asp:LinkButton ID="btnBuy" runat="server" CssClass="btn btn-success" OnClick="btnBuy_Click">购买</asp:LinkButton> </div> </div> </div> <div class="col-md-4 mb-4"> <div class="card"> <img src="../../素材图片/groceries.png" class="card-img-top" alt="商品图片"> <div class="card-body"> <h5 class="card-title">示例商品</h5> <asp:LinkButton ID="LinkButton1" runat="server" CssClass="btn btn-primary" OnClick="btnAddToCart_Click">添加购物车</asp:LinkButton> <asp:LinkButton ID="LinkButton2" runat="server" CssClass="btn btn-success" OnClick="btnBuy_Click">购买</asp:LinkButton> </div> </div> <!-- 可添加更多商品卡片 --> </div> </div> </form> <script src="../../bootstrap-5.2.2-dist/bootstrap-5.2.2-dist/js/bootstrap.bundle.min.js"></script> </body> </html> 根据代码写出aspx.cs的功能代码,功能为提取ProductTb1中的PName,PPrice字段来显示每个商品的名称和价格,请基于原本的代码添加功能
06-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值