回避策が見つかりました。それはエレガントではないかもしれませんが、それは機能し、最も重要なのは、ビューに流れ込むモデル属性を保持していることです。それは3つのステップで構成されています。
長いページで多くのフォームを使用するサイトがあるので、これを何度も再利用できます。私は2つのフォームを持っている場合、私はちょうどjavascriptを変更し、各フォームを処理するために2番目のdiv ID、または3番目のAND ViewBagsを追加することができます。重要なのは、コントローラのViewBag.FormOneTopの値を初期化し、ビューにdivを含めることです。
STEP 1:
あなたのBeginForm(上記ごVIEWにdiv要素を追加します)。あなたが望むものをidに付けてください。
<div id="FormOne"></div>
@using (Html.BeginForm())
STEP 2:
共有レイアウトページ、通常_Layout.cshtmlまたはそのような何かにあなたのjQueryのリンクの下に次のJavaScriptを追加します。 FormOneの名前をdivの名前に変更します。私は上に応答するnavbarを持っているので、オフセットを使用しました。オフセットは必要ありません。
<script>
$(document).ready(function()
{
var FormOneTop = '@ViewBag.FormOneTop';
if (FormOneTop== 'True')
{
$('html, body').animate(
{
scrollTop: $("#FormOne").offset().top -75
}, 1000);
}
});
</script>
ステップ3:
ViewBag.FormOneTopの値を設定して、コントローラのアクションにコードを追加します。フォームの投稿なしでインデックスページを読み込むと「偽」に設定され、ページは先頭に移動します。フォームアクションを「投稿」しただけで、ModelState.IsValidが失敗した場合、ViewBag.FormOneTopを "True"に設定します。
public ActionResult Index()
{
ViewBag.FormOneTop= "False";
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Index([Bind(Include = "id,first_name,last_name,email")] MyTable MyTable)
{
if (ModelState.IsValid)
{
ViewBag.FormOneTop= "False";
return View();
}
else
{
ViewBag.FormOneTop= "True";
return View();
}
}