2012-04-16 3 views
0

私はいくつかのサーバー側の検証を持つページを持っています。それは、サーバー検証の失敗で、同じページを表示し、データが入力されたフォームの上に検証エラーのあるボックスが表示されます。ビューを返すだけでなく、divにジャンプします

私の問題は、ページ上部に他のものがたくさんあることです。そのため、ユーザーはエラーボックスに誘導されず、実際には画面外になる可能性があります。エラーはdiv #server_errorsにあります。私が望むのは、コントローラにビューを返すように指示することですが、urlに#server_errorsを追加するのと同じエラーセクションにジャンプします。このような

コントローラリターン:

public ActionResult ChangeRiskCategory(Guid id) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 
} 

、私はこの時点でビュー内のdiv IDを注入する方法を見ることができません。私はクライアント側がこの問題を解決することを確認することができますが、jsが有効になっていなければ動作する必要があるので、ルールを外してください。

+1

まあ、私はエラーの概要やで最初のエラーへの自動スクロールにクライアント側のJSを使用して見ることができる:

あなたは単純に放出する可能性がjavascriptの使用についてのあなたの心を変更した場合)ectingしかし、それはJavaScriptを必要とするので、JSを無効にしても機能しません。 URLでハッシュタグ(#server_errors)を取得する唯一の方法は、リダイレクトを行うことですが、それにも制限があります。 –

答えて

1

のように多くの状態にそれを追加することができ、余分な検証メッセージを必要とする場合は、この

@model SampleApplication.Models.BasicDemoModel 

<form id="AjaxForm" action="/"> 
    <table> 
     <tr> 
      <td>@Html.LabelFor(x => x.Name)</td> 
      <td> 
       @Html.TextBoxFor(x => x.Name) 
       @Html.ValidationMessageFor(x => x.Name, "*") 
      </td> 
     </tr> 
     <tr> 
      <td>@Html.LabelFor(x => x.Email)</td> 
      <td> 
       @Html.TextBoxFor(x => x.Email) 
       @Html.ValidationMessageFor(x => x.Email, "*") 
      </td> 
     </tr> 
     @{ 
      Html.RenderPartial("Address", Model); 
     } 
    </table> 
    @if (!string.IsNullOrWhiteSpace(Model.Message)) 
    { 
     <h2>@Model.Message</h2> 
    } 
    @if (!ViewContext.ViewData.ModelState.IsValid) 
    { 
     @Html.ValidationSummary() 
    } 
    <input type="submit" title="Submit Form" onclick="PostFormWithAjax();return false;" /> 
</form> 

のようなものを見て見てい

public ActionResult ChangeRiskCategory(Guid id, bool error = false) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    if (!error && !ModelState.IsValid /*or other way of working out the error will be displayed*/) 
    { 
     return Redirect(Url.Action("ChangeRiskCategory") + "?id=" + id + "&error=true#server_error"); 
    } 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 

} 

(「エラー」パラメータは、無限に停止することです。redir

location.href='#server_errors'; 
+0

これは、検証ロジックとページの負荷が失敗ごとに2回実行されることになることに注意する価値があるので、このソリューションは私が "それ以外の場合は失敗します。 JSが無効になっているかどうかを検出し、これを緩和するためにこの例ではサーバー側のリダイレクトのみを行うことを検討してください。 –

1

ViewModelのプロパティとしてdiv idをViewに渡すのはどうですか?その後、あなたはJavascriptでそれを望むものをビューで実行することができます。結局のところ、ViewModelはビューのデータと状態を表します。

+0

ダンテに感謝します。理想的には、jsなしで動作するものを探しています。 –

+0

その部分に気付かなかった、ごめんなさい。 – Dante

0

使用モデルベースの検証とあなたはちょうどあなたが試みることができる。この

public ActionResult ChangeRiskCategory(Guid id) 
{ 
    //... 
    //call server side method, handle errors 
    //... 
    ModelState.AddModelError("MyInput","This isn't Right"); 
    return View("ChangeRiskCategory", changeRiskCategoryModel); 
} 
+0

私は仕事にあなたのリンクを得ることができません –

関連する問題