2017-02-14 111 views
0

我想打電話給MarriageById如GET,像這樣:ASP.NET核心:從GET重定向到POST

var url = '/MarriageById?id=' + id; 

但我也希望有一個單一的ActionResult Marriage(Marriage marriage)是顯示視圖之前進行一些處理。第二個必須是POST,因爲它也會收到來自asp的「發送表單」。

我想this solution(見下面我自己的實現),但它仍然重定向爲GET和ActionResult Marriage未發現:

[HttpGet] 
public ActionResult MarriageById(int id) 
{ 
    var marriage = _marriageRepository.GetById(id); 
    return RedirectToAction(nameof(Marriage), marriage); 
} 

[HttpPost] 
public ActionResult Marriage(Marriage marriage) 
{ 
    var people = _personRepository.GetAll(); 

    ViewBag.men = Utils.GetPersonsSelectListByGender(people, isMale: true); 
    ViewBag.women = Utils.GetPersonsSelectListByGender(people, isMale: false); 

    return View(marriage); 
} 

回答

4

使用RedirectToAction總是意味着一個GET,所以這是行不通的達到只接受POST的Marriage操作方法。

但是,自己調用另一個方法沒有任何問題,它仍然是一個像其他任何方法一樣的方法。因此,嘗試這個:

return Marriage(marriage); 

而且在一個側面說明:如果Marriage方法將總是隻被用來顯示數據,並從未保存,儲存或修改數據,然後使用POST是不是最好的選擇。 POST通常意味着帶有副作用的調用(保存,存儲,更改甚至刪除),並且通常最好遵守該約定。

+0

我用'RedirectToAction',而不是'返回婚姻(婚姻);'因爲它然後去找到MarriageById'的'了'View'(而不是'Marriage')。當然,如果您將基礎視圖返回修復爲'return View('Marriage');',那麼可以解決這個問題。但是我搜索了一下,人們推薦'RedirectToAction',我想我在這之後會混淆一些概念。感謝您的詳細解答,將其標記爲已解決,因爲它提供瞭解決方案,而不僅僅是信息。 –

1

我不認爲你應該混合GET和POST動詞。它們在語義上不同。 如果您有一個類似的功能需要爲這兩種方法執行,也許而不是從GET調用POST,您可能需要提取其他「私有」方法或甚至層(取決於用例)的公共部分。

希望這是有道理的

+0

謝謝,這是Peter B的答案的一個很好的延伸。 –