zoukankan      html  css  js  c++  java
  • Sys.WebForms.PageRequestManagerServerErrorException(status code 500 OR 12031)

    我们只要在响应Sys.Application的load事件即可,它会在页面第一次加载时,以及每次Partial Rendering之后被触发,我们在这时候修改页面中form元素的action属性即可,如下:
      
      相应Sys.Application的load事件
      Sys.Application.add_load(function()
      {
       var form = Sys.WebForms.PageRequestManager.getInstance()._form;
       form._initialAction = form.action = window.location.href;
      });
      
        至于为什么应该这样获得页面中的form元素,_initialAction又是什么,以及为什么要设置它,就要牵涉到UpdatePanel的实现方式,在这里就不多作解释了。只要页面中放置了这么一小段代码,这个问题就被解决了。
      
      
      
      深入问题:
      
        造成这个问题的原因,其实就是因为在Url Rewrite之后,form元素的action并非客户端请求的地址,而是Url Rewrite的目标地址。如果我们没有使用Partial Rendering,而是使用了最传统的PostBack,虽然不会造成页面功能的破坏,但是在PostBack之后,用户就会发现地址栏的内容变了,直接变成了目标地址。这可不是我们希望看到的结果,既然Rewrite了,就把它Rewrite到底。当然,我们依然可以使用上面提到的办法,使用JavaScript来修改form元素的action,但是这个做法实在不够“美观大方”,而且用户从HTML源文件中也可以看到我们Url Rewrite的目标地址,不是吗?
      
        如果我们能够在服务器端设置Form的action就好了,可惜System.Web.UI.HTMLControls.HTMLForm类不允许我们这么做。不过还好,我们用的是ASP.NET,我们用的是面向对象的编程模型。于是我们“继承”System.Web.UI.HTMLControls.HTMLForm,实现一个自己的Form控件:
      
      继承HTMLForm类实现自己的From
      namespace ActionlessForm {
       public class Form : System.Web.UI.HTMLControls.HTMLForm
       {
       protected override void RenderAttributes(HTMLTextWriter writer)
       {
       writer.WriteAttribute("name", this.Name);
       base.Attributes.Remove("name");
       writer.WriteAttribute("method", this.Method);
       base.Attributes.Remove("method");
       this.Attributes.Render(writer);
       base.Attributes.Remove("action");
       if (base.ID != null)
       writer.WriteAttribute("id", base.ClientID);
       }
       }
      }
       
      
        然后我们就可以在页面中使用它了。当然,在这之前,我们需要在页面(或Web.config)里注册它:
      
      使用我们自己实现的Form
      <%@ Register TagPrefix="skm" Namespace="ActionlessForm"
       Assembly="ActionlessForm" %>
      ...
      <skm:Form id="Form1" method="post" runat="server">
      ...
      </skm:Form>
      
        至此,我们已经不需要在页面里编写一段“巧妙”的JavaScript了,Url Rewrite之后form元素的action问题被解决了。
  • 相关阅读:
    c# netcore 发送http请求并接收返回数据
    CentOS7 nginx安装与卸载
    c# 取出特定标签的内容 去除html标签
    dotnet运行项目
    hangfire自定义访问api接口
    10万个数中取最大的10个数
    指定的服务已标记为删除
    gitlab-配置邮件
    gitlab-centos的安装
    ansible-任务控制tags
  • 原文地址:https://www.cnblogs.com/frogbag/p/676768.html
Copyright © 2011-2022 走看看