2017-05-28 71 views
4

(很抱歉,如果所有這些問題都是愚蠢的)ASP.NET MVC超載控制器方法不能正常工作

我在我的控制器兩種方法

[HttpGet] 
[Authorize] 
public ActionResult Pokemon(int id) 
{ 
    var user = db.PDCUsers 
       .SingleOrDefault(x => x.Username == User.Identity.Name); 
    var pkmn = db.PlayerPkmns.SingleOrDefault(x => x.Id == id); 

    return View(new DetailedPokemonViewModel(pkmn, user.Id, user.StepsIncMult)); 
} 

[HttpPost] 
[ChildActionOnly] 
[Authorize] 
public ActionResult Pokemon(int id, int steps) 
{ 
    var user = db.PDCUsers.SingleOrDefault(x => x.Username == User.Identity.Name); 
    var pkmn = db.PlayerPkmns.SingleOrDefault(x => x.Id == id); 
    if (pkmn.CurrentTrainerId == user.Id) 
    { 
     pkmn.Experience = pkmn.Experience + steps; 
     db.SaveChanges(); 
    } 
    return Pokemon(id); 
} 

我m從Pokemon(int id)查看Pokemon(int id, int steps)

<a href="@Url.Action("Pokemon", "PokemonView", new { id = Model.Id, steps = 5000 })">walk</a> 

但是,當我點擊鏈接Pokemon(int id, int steps),它不更新數據庫值 - 當我把一個斷點,它不註冊。我不認爲我甚至擊中了這個方法,但是頂部的url有steps參數連接?

所有我想要做的是更新作爲參數傳遞的步驟數量的數據行的經驗值。我不想要一個新的視圖(現在) - 我只是想讓它再次顯示Pokemon(int id)視圖。

是否有調用方法然後返回到它被稱爲從視圖的最佳做法?另外,是否有任何明顯的原因,爲什麼我的數據庫值不更新/斷點沒有被打中?

感謝


編輯:

通過使用RedirectToAction而不是返回的Pokemon(int id)方法, 和重命名Pokemon(int id, int steps)避免過載問題HTTPGET,它的作品!

謝謝!

+0

操作會導致GET請求發生。您使用POST標記了該操作。另外,如果您不想刷新視圖,請使用AJAX調用 – Nkosi

+0

您必須從第二種方法中刪除'[HttpPost]'。 –

+0

我嘗試刪除HttpPost,但它仍然不更新 - 我會嘗試與AJAX搞亂 – mint

回答

2

ChildActionOnly屬性確保操作方法只能從視圖內作爲子方法調用。所以你不需要使用[ChildActionOnly]。您正在使用a轉到鏈接,因此它是GET請求。

所以刪除

[HttpPost] 
[ChildActionOnly] 

,改變你的return語句,如:

return RedirectToAction("Pokemon", new {id = id}); 

希望這是給你的幫助。

+0

謝謝!但我仍然有一些問題 它看起來像是調用方法 - 我改變了口袋妖怪(int id,int steps)中的返回以返回一個靜態值,並且該視圖沒有反映這些更改。 我不認爲我正確地調用了視圖。 – mint

+0

@mint檢查更新答案。 – Ashiquzzaman

+0

謝謝!RedirectToAction肯定會解決我後來會遇到的問題,但仍然有一件事情 - 將兩個重載的方法都作爲httpgets拋出一個錯誤 - 我會看看如果我只是重命名pokemon會發生什麼(int id,int steps) 工作完美! – mint