iT邦幫忙

0

ASP.NET表單POST如何做?

請教各位先進:
我在ASP.NET測試了一些方法,想要把值POST過去另一個頁面,可以到了另一個頁面卻都取不到值,不知道有沒有範例可以參考實做呢?

我的實做內容如下:
檔案:post3.aspx
<form id="form1" runat="server" method="post" action="post2.aspx">
<div>
TextBox:
<asp:TextBox ID="TB1" runat="server">TextBox</asp:TextBox>
<br />
<asp:Button ID="Button5" runat="server" Text="Server Transfer" OnClick="Button5_Click" />
<br />
TextBox值可以傳過去
HiddenField 在Code端動態改值後傳過去沒值
預設寫值可傳的過去
HTML的值可以傳過去
<asp:HiddenField ID="HF1" runat="server" />
<asp:HiddenField ID="HF2" runat="server" Value="HF2" />
</div>
</form>

檔案:post3.cs
HF1.Value = "隱藏欄位HF1!修改";
HF2.Value = "隱藏欄位HF2!修改";
Server.Transfer("./post2.aspx");

檔案:post2.cs
Response.Write("asp:TextBox:" + Request.Form["TB1"] + " <br />");
Response.Write("asp:HiddenField1沒預設值:" + Request.Form["HF1"] + " <br />");
Response.Write("asp:HiddenField2有預設值:" + Request.Form["HF2"] + " <br />");

輸出結果:
asp:TextBox:TextBox
asp:HiddenField1沒預設值:
asp:HiddenField2有預設值:HF2

HiddenField在有預設值的狀況下是可以POST過去
若沒有值,或是由behind code去動態修改HiddenField的值後,POST過去就取不到值了,不知道為什麼,或是有什麼其它寫法可以把值動態的POST過去的呢?
研究了好久都測不出來,拜託各位指教了。謝謝

2 個回答

0
mybeldandy
iT邦研究生 5 級 ‧ 2014-12-13 07:15:13

應該是POST不能用HIDDENFIELD
請改用TEXTBOX 然後在STYLE中HIDDEN就好

leo226 iT邦新手 5 級 ‧ 2014-12-13 13:15:57 檢舉

檔案:post3.cs
TB1.Text = "TB值修改後";
HF1.Value = "隱藏欄位HF1!修改";
HF2.Value = "隱藏欄位HF2!修改";
Server.Transfer("./post2.aspx");

我在behind code按鈕按下去的方法裡修改TEXTBOX 的值後,傳過去的post2頁面接收到的值並不是修改後的值,所以不知道在值有可能會變動的狀態下如何傳過去?
不知道是否有實作的簡單範例可以參考呢?

謝謝指教^^

6
外獅佬
iT邦大師 1 級 ‧ 2014-12-15 00:28:52

不需要把hiddenfield換成textbox,因為隱藏欄位本來就會被submit出去的...
你要做的是...
1.post3.aspx上加上這麼一行程式...

&lt;pre class="c" name="code">&lt;%@ Reference Page="~/Post2.aspx" %>

2.這一行程式改成這樣....

&lt;pre class="c" name="code">Server.Transfer("./post2.aspx",true);

3.post2.aspx.cs就可以這麼寫....

&lt;pre class="c" name="code">Response.Write("asp:HiddenField1:" + ((HiddenField)((post3)Context.Handler).FindControl("HF1")).Value;
看更多先前的回應...收起先前的回應...
外獅佬 iT邦大師 1 級 ‧ 2014-12-15 00:29:53 檢舉

只是我有個小問題....post2...post3...不能給點有意義的名字嗎?

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 00:41:17 檢舉

如果不想這麼麻煩....
那麼...post2這麼寫....

&lt;pre class="c" name="code">
Response.Write("asp:HiddenField1:" + ((HiddenField)Page.PreviousPage.FindControl("HF1")).Value);
leo226 iT邦新手 5 級 ‧ 2014-12-15 10:50:59 檢舉

您好:
謝謝您的回答!
1.因為只是在測試post的功能而已,所以檔案就隨便命名了,如果測試成功再把它用到正式環境,造成混亂,不好意思。
2.我不是要把hiddenfield換成textbox,只是在測試看什麼東西可以post過去,什麼東西不行,所以用了hiddenfield和textbox來看有沒有差別,測試結果是只能傳預設值過去,如果後端Code改值後,傳過去的值也是預設值,而不是動態改過的值,不知道是不是因為asp.net的運作流程有關係,導致在修改值之前頁面就已經post過去了,或其它什麼原因?真的不太清楚!
3.我post3和post2改成了您說的語法後,在post2出現了下圖的錯誤訊息,不知道是少了什麼東西?

leo226 iT邦新手 5 級 ‧ 2014-12-15 10:51:46 檢舉

leo226 iT邦新手 5 級 ‧ 2014-12-15 10:52:45 檢舉

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 10:57:10 檢舉

Orz...
第一...post2請改成你自己的Post2那個class名稱
第二...對於C#來說,大小寫是有分別的,HiddenField有Value屬性,但是沒有value屬性

leo226 iT邦新手 5 級 ‧ 2014-12-15 15:04:53 檢舉

您好:
非常謝謝您的解答,使用以下寫法已可以正常post,而且也可以取得code behind修正後的值了!
Response.Write("asp:HiddenField1:" + ((HiddenField)Page.PreviousPage.FindControl("HF1")).Value);

另外想再請教個笨問題:
關於第一種的寫法
Response.Write("asp:HiddenField1:" + ((HiddenField)((post3)Context.Handler).FindControl("HF1")).Value;
我的post3.cs的class名稱為如下圖是Video_post3

在post2要引用post3的方法error如下圖:

那我在post2.cs裡要如何引入post3.cs的class來取得post3裡的方法和變數呢?
我使用using Video_post3;這個也不行
不知道要如何引用其它頁面.aspx的class
一般我都是在App_Code裡建一個xxx.cs的class,再為class命名namespace來using,但要如何使用.aspx的class就不知道如何引用了。

謝謝你的指教,獲益良多,謝謝。

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 16:30:37 檢舉
&lt;pre class="c" name="code">
外獅佬 iT邦大師 1 級 ‧ 2014-12-15 16:31:17 檢舉
&lt;pre class="c" name="code">&lt;%@ Reference Page="~/Post2.aspx" %>

外獅佬好厲害簽名
不愧是明教備用教主..

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 16:37:27 檢舉

為啥是『備用』的啊?
陽頂天都葛屁這麼久了抗議

leo226 iT邦新手 5 級 ‧ 2014-12-15 17:48:13 檢舉

您好:
我在post3.aspx有加
<%@ Reference Page="~/post2.aspx" %>

另外在post2.aspx也有加了,去測試,還是error
<%@ Reference Page="~/post3.aspx" %>

所以意思是只要在post3.aspx加了這一行<%@ Reference Page="~/post2.aspx" %>,那麼在post2.cs就可以直接取用Video_post3 Class裡面的function和變數嗎?
還是還有什麼地方少加了呢?因為我都有加Reference了,不過還是測不出來。

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 18:00:19 檢舉

leo226提到:
直接取用Video_post3 Class裡面的function和變數

為什麼要這麼做??
Server.Transfer只是讓網頁之間可以傳遞資料而已,並不是用來做『程式共用』的哦
如果你需要這樣的功能,應該把這些需要共用的程式碼,寫成獨立的class。

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 18:02:36 檢舉

另外,server.transfer只能把前一個頁面的form欄位資料帶到下一個頁面。
至於那些個什麼function、變數,忘了它吧。

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 18:06:43 檢舉

最後,看到你最後po上來那張錯誤圖
想必應該是你的code根本不認識Video_post3這個類別,嘗試把完整的namespace加上去試試。
再強調一次...Video_post3這個類別,是一個Page。
預設的情況下,那些個事件處理常式、表單欄位server control,都是protected。
看樣子,您該去找本asp.net的書研讀一番了謝謝

leo226 iT邦新手 5 級 ‧ 2014-12-15 18:51:25 檢舉

因為我看到這篇最下面Server.Transfer的Code寫法,感覺好像差不多:
http://blog.csdn.net/keymo\_/article/details/7895450
======================
//create instance of source web form
WebForm1 wf1;
//get reference to current handler instance
wf1=(WebForm1)Context.Handler;
Label1.Text=wf1.Name;
Label2.Text=wf1.EMail;
======================
您的是用Context.Handler去FindControl
它的是用Context.Handler去找function和get參數
所以才會誤解,我會忘了他的,謝謝。
我現在的問題是不知道如何讓post2去認識Video_post3這個類別。
我也有試著在post3加入namespace,但加入了namespace後,裡面的控制項就都報錯了,錯誤說明控制項不在內容中,如下圖。

所以不知道是不是我加入namespace的寫法有錯誤嗎?我沒在Code Behind中寫入過namespace,只有在App_Code自訂的類別有加入過,同樣的寫法好像不能通用。
不知道寫法是不是如下呢?
檔案post3.cs
namespace postTest
{
public partial class Video_post3 : System.Web.UI.Page
{
}
}

檔案post2.cs
using postTest;

現在是post3加入namespace後,所有控制項就都報錯了,真的不知道問題出在那裡,我只想要確認我的寫法有沒有錯,若沒錯,再找看看是不是有其它問題所造成。

謝謝您的指教,感激不盡!

外獅佬 iT邦大師 1 級 ‧ 2014-12-15 22:36:03 檢舉

落寞....每一個page預設的namespace就是『專案名稱』.『子目錄名稱』...
說真的,我已經不太懂發問者現在的問題到底是什麼了
建議你,去找本C#的書,從基礎打好比較要緊哦

leo226 iT邦新手 5 級 ‧ 2014-12-16 00:02:50 檢舉

嗯,不好意思,造成困擾了,我只是想要把您教的第一種寫法也做出來而已,如您說的要加namespace、要把post3改為類別名稱Video_post3,但持續引發其它非本文的問題,所以造成混亂了,不好意思!

Response.Write("asp:HiddenField1:" + ((HiddenField)((post3)Context.Handler).FindControl("HF1")).Value;

我有看過一些入門或進階的書,可是印象中沒有教到這些東西,我會再去進修的,不知有無推廌好用的參考書?
謝謝指教。

外獅佬 iT邦大師 1 級 ‧ 2014-12-16 00:12:03 檢舉

好問題...請教mislab2000老師吧

外獅佬 iT邦大師 1 級 ‧ 2014-12-16 00:13:52 檢舉

啊..好吧我錯了
...是mis2000lab老師Orz

wiselou提到:
為啥是『備用』的啊?
陽頂天都葛屁這麼久了

不要忘了有張無忌...偷笑
不過先等老鷹有外孫落寞

外獅佬 iT邦大師 1 級 ‧ 2014-12-16 08:43:23 檢舉

先想怎麼弄出個女兒比較要緊吧汗

wiselou提到:
先想怎麼弄出個女兒比較要緊吧

老鷹覺得先弄出一個老婆比較要緊偷笑
依照金庸劇情,那是你的義子偷笑

外獅佬 iT邦大師 1 級 ‧ 2014-12-16 09:17:41 檢舉

根據不負責編劇的說法
你要先去弄出一個女兒,
然後派她開車去勾引張翠山
最後兩個一起滑進冰火島摩鐵
要記住哦...不是外遇,是巧遇毆飛

然後要先把外獅佬眼睛矇上.....拿著西瓜刀給外獅佬偷笑

我要發表回答

立即登入回答