(抱歉,如果所有这些问题都是愚蠢的)
我的控制器中有两种方法
[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);
}
我正在Pokemon(int id, int steps)
视图中通过
Pokemon(int id)
<a href="@Url.Action("Pokemon", "PokemonView", new { id = Model.Id, steps = 5000 })">walk</a>
但是,当我点击链接Pokemon(int id, int steps)
时,它不会更新数据库值 - 当我在其中放入断点时,它不会注册。我认为我甚至不打算使用该方法,但顶部的url是否已将步骤参数连接起来?
我要做的就是通过作为参数传递的步骤数来更新数据行的体验值。我不想要一个新的视图(现在) - 我只是希望它再次显示Pokemon(int id)视图。
调用方法然后返回到调用它的视图是否有最佳实践?另外,有没有明显的原因导致我的数据库值没有更新/断点未被命中?
由于
编辑:
使用RedirectToAction
代替返回Pokemon(int id)
方法,
并重命名Pokemon(int id, int steps)
以避免重载httpget问题,它的工作原理!
谢谢!
答案 0 :(得分:2)
ChildActionOnly属性确保只能从视图中调用操作方法作为子方法。所以你不需要使用[ChildActionOnly]
。您使用a
转到该链接,因此这是GET
请求。
删除
[HttpPost]
[ChildActionOnly]
并将您的退货声明更改为:
return RedirectToAction("Pokemon", new {id = id});
希望对你有帮助。