LoginSignup
2
0

More than 5 years have passed since last update.

ASP.NET Core MVCでhiddenの値を変更する

Last updated at Posted at 2019-02-11

概要

POSTされたhiddenの値を変更しても、その内容が変更内容が反映されない。
ContollerでModelStateをClearすると反映されるようになる。
詳細は下記を参照。

環境
.Net Core 2.2

サンプルコード

Controller
public IActionResult Index()
{
    var vm = new ViewModel { Value = 1 };
    return View(vm);
}

[HttpPost]
public IActionResult Index(ViewModel vm)
{
    vm.Value = 2;
    return View(vm);
}
ViewModel
public class ViewModel
{
    public int Value { get; set; }
}
View
@model ViewModel

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form method="post">
        <input asp-for="Value" type="hidden" />
        <span>@Model.Value</span>
        <button type="submit">送信</button>
    </form>
</body>
</html>

対応前実行結果

POST前と後でspanの値は変わっているが、hiddenの値は変わっていない。

POST前
<!DOCTYPE html>
<html>
<head></head>
<body>
    <form method="post">
        <input type="hidden" id="Value" name="Value" value="1" />
        <span>1</span>
        <button type="submit">送信</button>
    </form>
</body>
</html>
POST後
<!DOCTYPE html>
<html>
<head></head>
<body>
    <form method="post">
        <input type="hidden" id="Value" name="Value" value="1" />
        <span>2</span>
        <button type="submit">送信</button>
    </form>
</body>
</html>

対応内容

Controller
[HttpPost]
public IActionResult Test(ViewModel vm)
{
    ModelState.Clear();
    // もしくは
    // ModelState.Remove("Value");
    vm.Value = 2;
    return View(vm);
}

補足

リストデータの場合、POST前に存在するインデックスの値は変更が判衣されない。

Controller
public IActionResult Index()
{
    var vm = new List<ViewModel> 
    {
        new ViewModel { Value = 1 },
        new ViewModel { Value = 2 }
    };
    return View(vm);
}

[HttpPost]
public IActionResult Index(List<ViewModel> vm)
{
    vm = new List<ViewModel> 
    {
        new ViewModel { Value = 3 },
        new ViewModel { Value = 4 },
        new ViewModel { Value = 5 }
    };
    return View(vm);
}
View
@model List<ViewModel>

<!DOCTYPE html>
<html>
<head></head>
<body>
    <form method="post">
        @for (var i = 0; i < Model.Count; i++)
        {
            <input asp-for="@Model[i].Value" type="hidden" />
            <span>@Model[i].Value</span>
        }
        <button type="submit">送信</button>
    </form>
</body>
</html>
POST前
<!DOCTYPE html>
<html>
<head></head>
<body>
    <form method="post">
            <input type="hidden" id="z0__Value" name="[0].Value" value="1" />
            <span>1</span>
            <input type="hidden" id="z1__Value" name="[1].Value" value="2" />
            <span>2</span>
        <button type="submit">送信</button>
    </form>
</body>
</html>
POST後
<!DOCTYPE html>
<html>
<head></head>
<body>
    <form method="post">
            <input type="hidden" id="z0__Value" name="[0].Value" value="1" />
            <span>3</span>
            <input type="hidden" id="z1__Value" name="[1].Value" value="2" />
            <span>4</span>
            <input type="hidden" id="z2__Value" name="[2].Value" value="5" />
            <span>5</span>
        <button type="submit">送信</button>
    </form>
</body>
</html>
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0