iT邦幫忙

0

ASP.NET MVC POST

各位先進好,想請教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回去原本的頁面呢?

1 個回答

0
小魚
iT邦高手 1 級 ‧ 2019-07-16 21:54:33

你可能要加強一下網站前後端的觀念,
從Controller到前端就不叫POST了...
簡單來說你是要把Delete的結果送到前端吧,
其實你可以用ViewBag將資料帶到前端,
最簡單的例子,
XXXController.cs

[HttpPost]
public ActionResult DeletePaperOrder
{
    ViewBag.Result = "成功!";
    return View("OrderPaper");
}

OrderPaper.cshtml

@ViewBag.Result
... ...

如果沒有指定ViewBag.Result,前端就是NULL,就不會顯示
如果有指定,前端就會顯示,
然後再配上CSS增加美觀就好了.

看更多先前的回應...收起先前的回應...
leo226 iT邦新手 5 級 ‧ 2019-07-17 09:26:53 檢舉

了解~
我想的是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 });
}
小魚 iT邦高手 1 級 ‧ 2019-07-17 09:30:57 檢舉

正常來說應該是要帶到Get,
因為POST通常是要做新增修改等動作才會用到,
使用RedirectToAction就可以帶到Get頁面了.
不過使用了RedirectToAction,
在DeletePaperOrder指定ViewBag.Result就沒有意義了,
也許可以用Session或Get帶入參數.

leo226 iT邦新手 5 級 ‧ 2019-07-17 10:05:33 檢舉

嗯,因為很多教學為了安全性都建議用POST來做,所以就想試著都用POST來處理,但用POST確實會遇到一些實作上的困擾...><
我這個需求沒有需要帶ViewBag.Result這個結果進去,只需要把原本參數帶回PageB,User看清單就可以知道有沒有刪除成功了。
所以目前看起來這個需求只能用Get來實作了,如果有其它大大有其它方法,再請不吝指教~也感謝小魚大的指點,謝謝~

leo226 iT邦新手 5 級 ‧ 2019-07-17 10:12:06 檢舉

又或許用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處理~

小魚 iT邦高手 1 級 ‧ 2019-07-17 11:10:10 檢舉

現在很多都是前後端分離,
基本上就需要類似ajax的方法,

另外一般來說取得資料通常是用Get,
如果是新增修改刪除等要改變資料的才會用Post,
如果是Restful的規範還會考慮Put, Patch, Delete之類的,
不過form基本上只能用Get和Post,
其他的方法基本上就是用參數的方式帶到後端了.

froce iT邦大師 6 級 ‧ 2019-07-17 15:10:35 檢舉

ajax你還是會遇到要用POST還是GET的問題啊...
有時候你連取得資料的參數都想要藏起來就可以用POST,至少不能直接用網址拿。
不過通常取得是用GET沒錯。

當然,誤用的也不少...

我要發表回答

立即登入回答