【问题标题】:C# Posting form from JavaScript to another .aspx but no parameters in ParamsC# 将表单从 JavaScript 发布到另一个 .aspx 但在 Params 中没有参数
【发布时间】:2021-02-01 18:46:08
【问题描述】:

在一个 .aspx 页面中,我使用 JavaScript 填写了许多隐藏的表单域,然后想将表单发布到另一个 .aspx 页面。它正确提交了表单,但是当我查看表单操作中调用的页面中的 Request.Params["org"] 时,它为空。

<script src="prototype.js"></script>
<script>
function doIt() {
    $('org').value = org_int;
    $('frmCheckout').submit();
}
</script>
...
<form id="frmCheckout" method="post" action="checkout.aspx">
<input type="hidden" value="" id="org" name="org">
<input type="submit" onclick="doIt()" value="Submit">
</form>

$ 是在示例之前引入的原型符号。原型中的 $ 与 document.getElementById('frmCheckout') 相同。

主要编辑 2/1/2021 7:52: 在寻找解决方案时,我发现了一些新信息,但仍然不起作用。

我发现 PostBackUrl 会将 .aspx 的操作更改为另一个 .aspx 页面。这部分有效。提交时调用Checkout.aspx

<asp:Button ID="Submit" PostBackUrl="Checkout.aspx" runat="server" Text="Submit" />

但是 Checkout.aspx 中没有数据...... Request.Form(应该有)或 Request.Params 中没有值。
我也试过:

<asp:TextBox runat="server" name="jsonString" id="jsonString" value="js" />

但我得到一个无效的 __VIEWSTATE 我知道我应该更改它,但还没有任何效果。

【问题讨论】:

  • js 无法将数据从一个页面传输到另一个页面。 session 或 cookie 可以帮助您。 stackoverflow.com/questions/17502071/…
  • 暂时让你的隐藏元素成为标准文本框。在你提交之前它会显示你的期望值吗?
  • Jasen:我一直在检查调试器中的值,但将其设置为文本框以确保它正在显示数据。 Murat:我确实有数百个页面用 JS 填充表单字段并发布到经典的 asp 页面……这是第一次使用 .aspx。那么,.aspx 有什么不同呢?
  • 你的价值观真的被公布了吗?用 F12 检查。
  • 使用调试器 (F12) 来验证是否将正确的值放入表单字段......它们是。目标 .aspx 获取帖子,但那里没有值。

标签: c# form-submit


【解决方案1】:

试试下面的。在以下示例中,Javascript 需要位于表单代码之后。 Request.Form["org"] 用于从发布的数据中获取“org”的值。此外,如果在 Javascript 中使用 $,请务必在定义之前不要使用它。见javascript dollar sign variable not working

Test.aspx(有效)

<!-- directives -->
<% @Page Language="C#" %>

<html>
   <head> 
      <title> Test Form </title> 
   </head>
   
   <body>
      <h3> Test Form </h3>

      <form runat="server" id="frmCheckout" method="post" action="checkout.aspx">
         <input runat="server" type="hidden" id="org" name="org" value=""/>
         
      </form>

      <script>
          function setInitialVals() {
              document.getElementById('org').value = "3";
              document.getElementById('frmCheckout').submit();
          };

          setInitialVals();
      </script>
   </body>
</html>

checkout.aspx

<!-- directives -->
<% @Page Language="C#" %>

<html>
   <head> 
      <title> Checkout</title> 
   </head>
   
   <body>
      <h3> Checkout </h3>
      
       <% Response.Write("org: " + Request.Form["org"]); %>  
      
   </body>
</html>

以下操作无效

Test.aspx(不起作用)

注意:以下将不起作用,因为 Javascript 在输入元素呈现之前执行。

<!-- directives -->
<% @Page Language="C#" %>

<html>
   <head> 
      <title> Test Form </title> 
   </head>
   
   <body>
      <h3> Test Form </h3>

      <script>
          function setInitialVals() {
              document.getElementById('org').value = "3";
              document.getElementById('frmCheckout').submit();
          };

          setInitialVals();
      </script>

      <form runat="server" id="frmCheckout" method="post" action="checkout.aspx">
         <input runat="server" type="hidden" id="org" name="org" value=""/>
         
      </form>
   </body>
</html>

资源

Introducing ASP.NET Web Pages - HTML Form Basics

【讨论】:

  • 我编辑了这个例子。我试图画一张简单的图片,试图专注于未收到的帖子数据,但我混淆了这个问题。原型 ($) 是为其使用定义的。
【解决方案2】:

请改变方法。考虑在表单中添加一个 asp 按钮并为该按钮触发 click 事件;按钮属性需要像微软文档How to: Post ASP.NET Web Pages to a Different Page的这个主题:

<script src="prototype.js"></script>
<script>
function doIt() {
    $('#org').value = org_int;
    $('#btnPostBack').click();
}
</script>
...
<form id="frmCheckout" method="post">
<input type="hidden" value="" id="org" name="org">
<input type="button" onclick="doIt()" value="Submit">
<asp:Button ID="btnPostBack" ClientIdMode="Static" PostBackUrl="~/checkout.aspx"  runat="server" Text="Post Form To Another Page" style="display:none;"/>
</form>

注意:我在您的代码中看到 id 的选择器在您的 JS 代码中不包含主题标签前缀...

【讨论】:

  • 我试过
  • 我同时使用prototypejs和jQuery。原型使用 $('name'),而 jQuery 使用 $('#name')。 $('org') = org_int 没有问题。如果我在这里使用 JQuery,那就是 $('#org').val(org_int)。当我混合它们时,我使用 $j('#org')
【解决方案3】:

如果您想使用“org”作为查询字符串,请尝试将表单方法属性从帖子更改为获取:

$('org').value = org_int;
$('frmCheckout').submit();
...
<form id="frmCheckout" method="get" action="checkout.aspx">
<input type="hidden" value="" id="org" name="org">
</form>

【讨论】:

  • 其实还有很多参数。我只是为了这个概念展示了这个。 GET 可以正常工作,但 POST 更安全一些,并且几乎支持无限大小。
  • 好的。我相信“Request.Params”仅适用于当前 aspx 到当前代码后面;要跨页面,您需要使用 Request["org"] 来获取数据(如果可能,请在调试模式下进行验证)。
  • 我已经尝试过 Request、Request.Params、Request.Form,只是没有发布数据。
【解决方案4】:

更新

我下载了prototype.js 并将其添加到下面似乎有效的测试代码中。您发布的代码和下面的代码之间的唯一区别应该是我在函数“doIt”中硬编码了“org_int”的值:let org_int = 3;

test.aspx

<% @Page Language="C#" %>

<html>
   <head> 
      <title> Test Form </title> 
   </head>
   
   <body>
      <h3> Test Form </h3>

       <script src="prototype.js"></script>
             
       <script>
           function doIt() {

               try {
                        let org_int = 3;

                        $('org').value = org_int;
                        $('frmCheckout').submit();

                        //document.getElementById('org').value = org_int;
                        //document.getElementById('frmCheckout').submit();
               }
               catch (err) {
                   console.log(err);
                   alert(err);       
               }
           }

       </script>

        <form id="frmCheckout" method="post" action="checkout.aspx">
            <input type="hidden" value="" id="org" name="org">
            <input type="submit" onclick="doIt()" value="Submit">
        </form>
       
   </body>
</html>

checkout.aspx

<% @Page Language="C#" %>

<html>
   <head> 
      <title> Checkout</title> 
   </head>
   
   <body>
      <h3> Checkout </h3>
      
       <% Response.Write("Request.Form[\"org\"]: " + Request.Form["org"] + "<BR>"); %>  
       <% Response.Write("Request.Params[\"org\"]: " + Request.Params["org"]); %>  
      
   </body>
   
</html>

【讨论】:

  • 正如我在编辑后的帖子中所说的,$ 是“原型”......就像 jQuery 一样,这是它们引用与 getElementById 相同的元素的方式。它在“prototype.js”中定义在常规脚本标记之前。
  • 如果您还没有尝试过我发布的简单测试代码,您可能想尝试一下。
  • User9938... 重新阅读我上一篇关于 $ 来自哪里的帖子。您的测试帖子未包含prototype.js。然后,如果您想了解更多详细信息,可以查看prototypejs.org。 $ 绝对不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2022-01-23
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多