MVC ASP.NET重载控制器方法无法正常工作

时间:2017-05-28 08:25:08

标签: c# html asp.net asp.net-mvc database

(抱歉,如果所有这些问题都是愚蠢的)

我的控制器中有两种方法

[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问题,它的工作原理!

谢谢!

1 个答案:

答案 0 :(得分:2)

ChildActionOnly属性确保只能从视图中调用操作方法作为子方法。所以你不需要使用[ChildActionOnly]。您使用a转到该链接,因此这是GET请求。

删除

[HttpPost]
[ChildActionOnly]

并将您的退货声明更改为:

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

希望对你有帮助。