各位先進好,想請教POST的問題
我的網頁關聯如下圖:
PageB的Controller程式碼
[HttpPost]
public ActionResult OrderPaper(PaperViewModel PV)
{
PaperDBService paperSrv = new PaperDBService();
int ConferenceId = PV.ConferenceId;
int PaperId = PV.PaperId;
PV.MemberToPapers = paperSrv.GetMemberToPaper(ConferenceId, PaperId);
return View(PV);
}
PageB的View Button
<td>
@using (@Html.BeginForm("DeletePaperOrder", "Chairman", FormMethod.Post))
{
@Html.Hidden("ConferenceId", item.MemberToPapers.ConferenceId)
@Html.Hidden("PaperId", item.MemberToPapers.PaperId)
@Html.Hidden("MemberId", item.MemberToPapers.MemberId)
<input type="submit" value="移除指派" class="btn btn-primary" />
}
</td>
Delete的Controller
[HttpPost]
public ActionResult DeletePaperOrder(int ConferenceId, int PaperId, int MemberId)
{
paperSrv.DeletePaperOrder(ConferenceId, PaperId, MemberId);
return RedirectToAction("OrderPaper", "Chairman", new { ConferenceId = ConferenceId, PaperId = PaperId });
}
請問在Delete的Controller裡要如何再POST回去原本的頁面呢?
你可能要加強一下網站前後端的觀念,
從Controller到前端就不叫POST了...
簡單來說你是要把Delete的結果送到前端吧,
其實你可以用ViewBag將資料帶到前端,
最簡單的例子,
XXXController.cs
[HttpPost]
public ActionResult DeletePaperOrder
{
ViewBag.Result = "成功!";
return View("OrderPaper");
}
OrderPaper.cshtml
@ViewBag.Result
... ...
如果沒有指定ViewBag.Result,前端就是NULL,就不會顯示
如果有指定,前端就會顯示,
然後再配上CSS增加美觀就好了.
了解~
我想的是Delete Controller處理完後要再回到前一頁,但因為前一頁是用POST接收的Controller,所以才想說要用POST的方法這個Controller才會接~
[HttpPost]
public ActionResult OrderPaper(PaperViewModel PV)
{
PaperDBService paperSrv = new PaperDBService();
int ConferenceId = PV.ConferenceId;
int PaperId = PV.PaperId;
PV.MemberToPapers = paperSrv.GetMemberToPaper(ConferenceId, PaperId);
return View(PV);
}
所以問題是Delete完要如何才能把參數再帶回到這個POST的Controller呢?還是要再另外寫一個非POST的Controller來接呢?
還是小魚大大寫的這個方法,POST Controller會接嗎?
[HttpPost]
public ActionResult DeletePaperOrder(int ConferenceId, int PaperId, int MemberId)
{
ViewBag.Result = "成功!";
return View("OrderPaper");
}
本來要用RedirectToAction,但這樣的方式好像只能用Get,所以才想說要如何回到POST的那一個Controller~
[HttpPost]
public ActionResult DeletePaperOrder(int ConferenceId, int PaperId, int MemberId)
{
ViewBag.Result = "成功!";
return RedirectToAction("OrderPaper", "Chairman", new { ConferenceId = ConferenceId, PaperId = PaperId });
}
正常來說應該是要帶到Get,
因為POST通常是要做新增修改等動作才會用到,
使用RedirectToAction就可以帶到Get頁面了.
不過使用了RedirectToAction,
在DeletePaperOrder指定ViewBag.Result就沒有意義了,
也許可以用Session或Get帶入參數.
嗯,因為很多教學為了安全性都建議用POST來做,所以就想試著都用POST來處理,但用POST確實會遇到一些實作上的困擾...><
我這個需求沒有需要帶ViewBag.Result這個結果進去,只需要把原本參數帶回PageB,User看清單就可以知道有沒有刪除成功了。
所以目前看起來這個需求只能用Get來實作了,如果有其它大大有其它方法,再請不吝指教~也感謝小魚大的指點,謝謝~
又或許用Ajax來實作Delete的方法就可以達到在同一頁面執行刪除,並且更新同一頁面的內容,但因為Ajax我還很不會做,需要再做很多功課。
OrderPaper.cshtml
<tbody>
@foreach (var item in @Model.MemberToPapers)
{
<tr>
<td>
@item.RoleName
</td>
<td>
@item.Email
</td>
<td>
@item.Name
</td>
<td>
@using (@Html.BeginForm("DeletePaperOrder", "Chairman", FormMethod.Post))
{
@Html.Hidden("ConferenceId", item.MemberToPapers.ConferenceId)
@Html.Hidden("PaperId", item.MemberToPapers.PaperId)
@Html.Hidden("MemberId", item.MemberToPapers.MemberId)
<input type="submit" value="移除指派" class="btn btn-primary" />
}
</td>
</tr>
}
</tbody>
這個改成Ajax處理應該也不錯,但不知道要怎麼改成Ajax處理~
現在很多都是前後端分離,
基本上就需要類似ajax的方法,
另外一般來說取得資料通常是用Get,
如果是新增修改刪除等要改變資料的才會用Post,
如果是Restful的規範還會考慮Put, Patch, Delete之類的,
不過form基本上只能用Get和Post,
其他的方法基本上就是用參數的方式帶到後端了.
ajax你還是會遇到要用POST還是GET的問題啊...
有時候你連取得資料的參數都想要藏起來就可以用POST,至少不能直接用網址拿。
不過通常取得是用GET沒錯。
當然,誤用的也不少...