ASP.NET如何用post方法发送数据?

时间:2014-05-29 21:31:41

标签: c# html asp.net webforms

案例

我有两个网络表单,还有一些代码隐藏。第一个webform是一个公式,我输入一个字符串。我想使用post方法将该字符串发送到第二个表格,然后显示它。

问题

我收到一条错误消息,说无法验证MAC Viewstate:

  

Erreur du serveur dans l'application'/'。 Échecdela validation MAC   视图状态。 Si cette applicationesthébergéeparune batterie de   serveurs ou un cluster,assurez-vous que la configuration   spécifielemêmevalidificationKeyetlemeême算法验证。   AutoGenerate ne peutpasêtreutiliséedansun cluster。

我做错了什么?

WebForm1.aspx的

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

<!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>
</head>
<body>
    <form id="form1" runat="server" action="WebForm2.aspx" method="post">
        <div>
            Enter your first name : <input type="text" name="FirstName"/><br />
            <input type="submit" />
        </div>
    </form>
</body>
</html>

Webform2.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            First name : <%= FirstName %>
        </div>
    </form>
</body>
</html>

Webform2.aspx.cs

public partial class WebForm2 : System.Web.UI.Page
{
    public string FirstName { get; private set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        FirstName = Request.Form["FirstName"];
    }
}

注意:我对网络技术的经验很少,而且我正在尝试学习asp.net和html,所以请原谅我。


编辑1:

WebForm3.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication1.WebForm3" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
        <%if (!IsPostBack){ %>
        <div>
            Enter your first name :
            <input type="text" name="FirstName" /><br />
            <input type="submit" />
        </div>
        <% } else { %>
        <div>
            First name : <%= FirstName %>
        </div>
         <% } %>
    </form>
</body>
</html>

WebForm3.aspx.cs

public partial class WebForm3 : System.Web.UI.Page
    {
        public string FirstName { get; private set; }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                FirstName = Request.Form["FirstName"];
            }
        }
    }

WebForm1.aspx(修订版)

<form id="form1" runat="server" method="post">
        <div>
            Enter your first name : <input type="text" name="FirstName"/><br />
            <asp:Button PostBackUrl="~/WebForm2.aspx" Text="Validate" runat="server"/>
        </div>
    </form>

WebForm3.aspx工作正常,使用asp:Button的WebForm1也正常工作,非常感谢。

其他问题:

此测试的目的是寻找以“常见”方式发送数据的其他方式(post方法,因为“他们”说这是最安全的方式)。现在,我只留下一个问题:使用两个文件(WebForm1和WebForm2方法)或单个文件(WebForm3方法)的最佳实践是什么?换句话说,同一页面应该负责收集数据并对其进行处理,还是将这些责任分成两个文件?


编辑2,以及最后一个问题

使用两个文件时,我发现IsPostBack属性等于false。使用单个文件时,我会在提交时看到IsPostBack属性等于true。当使用单个文件时,该属性是否仅更改(因此有用)?

1 个答案:

答案 0 :(得分:5)

Webform1.aspx

<form id="form1" runat="server" action="WebForm2.aspx" method="post">

假设我理解了您要完成的任务 - 如果您想要覆盖WebForms的PostBack机制,一种简单的方法是使用PostBackUrlButton控件。

这是ASP.Net WebForms的工作方式(回发到同一页面)。还有POSTing to another WebForms Page的其他方式,但首先尝试PostBackUrl并查看是否真的需要(阻力最小)。

如果你想使用更多“标准化”的做事方式(比如想简单地想要POST到你选择的资源),你可以查看ASP.Net MVC或WebPages,就像我认为你想要完成的那样。

... H个


更新

嗯,你不会喜欢我的回答,因为“这取决于” -

  • ASP.net中的“常用方式”WebForms实际上是相同的页面 - 默认的PostBack机制,然后你可以像上面那样处理显示 - 但是通过controls(例如{{ 1}}或Placeholder)。

  • 您还可以查看向导控件之类的内容 - &gt;适用于需要引导用户完成user controls的情况 - 例如也许是一个冗长的申请表,你想把它变成更易于管理的步骤 - 使用Steps机制在一个Page中自己解决这个问题,甚至多个Postback(跨页发布)虽然可行,但可能是一种自我惩罚的练习:)

  • 还有其他方法,但我不想混淆和留在主题上(例如AJAX)。

  • 我会推迟“安全”,因为你需要对此更加具体 - 并且可能需要一个单独的问题。 一般操作规则是“不信任客户端”(意思是验证所有客户提供应用程序的所有数据),服务器端 - 不仅仅是客户端验证(它们应该携手合作,而不是相互排斥)。

... H个


更新3

  

使用两个文件时,我发现IsPostBack属性等于false。使用单个文件时,我会在提交时看到IsPostBack属性等于true。当使用单个文件时,该属性是否仅更改(因此有用)?

Page表示“此POST请求是否来自我自己”?

  1. Page1.aspx - &gt; IsPostBack - &gt; Page2.aspx = Button.PostBackUrlIsPostBack
  2. Page1.aspx - &gt;触发回发= false的任何按钮/控件都是IsPostBack
  3. 话虽如此,“只是有用” - 在这个简单的例子中也许。但是您可以将该检查用于其他事项 - 您之前提到过安全性,因此您可以检查您的网页是否可以/将/应该接受来自任何地方的POST请求。

    在您的示例中,POST的目标页面(当使用2页和true时)应该检查/验证它正在接收的POST数据 - 因为任何人都可以这样做你做的事情(POST到它)。