我发现了一种解决方法。它可能不够高雅,但它起作用,并且最重要的是它保留了流回视图的模型属性。它由三个步骤组成。
因为我有一个使用了大量的形式与长页面的网站,我可以一遍又一遍地重复这一点。如果我有两种形式,那么我可以修改javascript并添加第二个div ID,或第三个AND ViewBags来处理每个表单。重要的部分是记住初始化您的控制器中的ViewBag.FormOneTop的值,并将div包含在您的视图中。
STEP 1:
添加一个div您查看您的BeginForm以上()。无论你想要什么,都要命名这个ID
<div id="FormOne"></div>
@using (Html.BeginForm())
第2步:
添加以下JavaScript下方的JQuery的链接你的共享页面布局上,通常_Layout.cshtml或类似的东西。将FormOne的名称更改为任何您命名为div的名称。我使用了-75的偏移量,因为我在顶部有一个响应式导航栏,您可能不需要偏移量。
<script>
$(document).ready(function()
{
var FormOneTop = '@ViewBag.FormOneTop';
if (FormOneTop== 'True')
{
$('html, body').animate(
{
scrollTop: $("#FormOne").offset().top -75
}, 1000);
}
});
</script>
第3步:
代码添加到您的控制器设置ViewBag.FormOneTop价值的行动。在没有表单帖子的情况下加载索引页面时,我将其设置为“False”,并且页面转到顶部。如果我只是“张贴”表单动作,我会设置ViewBag.FormOneTop“真”,如果ModelState.IsValid失败。
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();
}
}