2017-01-16 8 views
0

modelstateが有効でない場合、どのようにページの名前付きアンカーに戻りますか?これはおそらく簡単な答えですが、答えを見つけることができません。modelstateが有効でないときにページの名前付きアンカーに戻るには?

名前付きアンカーを使用するほとんどのソリューションでは、MVCコントローラのモデルステートが失われ、モデルのすべての属性がそのまま残っているページのフォームの位置に戻したいとします。以下に示すコードは動作しません。私は十数種類のシナリオを試しましたが、私は迷っています。どんな助けもありがとう。これはおそらく単純なものです。

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

答えて

0

回避策が見つかりました。それはエレガントではないかもしれませんが、それは機能し、最も重要なのは、ビューに流れ込むモデル属性を保持していることです。それは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(); 
     } 

    } 
0

提供されているもう一つの選択肢は、単にまったく名前のアンカーを放棄し、フォームがページの上部にあるビューを設計することです。これにより、上記の手順が不要になります。しかし、他の誰かがより良い解決策を持っているなら、ここに投稿してください。

関連する問題