2017-01-16 29 views
0

当modelstate无效时,如何返回到页面中的已命名锚点?这可能是一个简单的答案,但我似乎无法找到答案。如何在modelstate无效时返回页面中的已命名锚点?

在使用命名锚大多数解决方案中,MVC控制器的ModelState丢失,我想所有的模型返回到窗体的位置在页面上的属性不变。下面显示的代码不起作用。我已经尝试了十几种不同的场景,而且我迷路了。任何帮助,将不胜感激。这可能很简单。

if (ModelState.IsValid) 
{ 
    ...do something 
} 
else 
{ 
    return View("MyView#NamedAnchor") 
} 

回答

0

我发现了一种解决方法。它可能不够高雅,但它起作用,并且最重要的是它保留了流回视图的模型属性。它由三个步骤组成。

因为我有一个使用了大量的形式与长页面的网站,我可以一遍又一遍地重复这一点。如果我有两种形式,那么我可以修改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(); 
     } 

    } 
0

已经提供了另一种选择是只放弃完全的命名锚和设计意见,并在形式在页面的顶部。这将消除我上面显示的步骤的需要。但如果其他人有更好的解决方案,请在此处发布。

相关问题