2

xVal を含む多くの ASP.Net MVC クライアント側検証のアイデアを見てきました。これは現時点では ValidationSummary を提供しないため、ModelState エラーをループし、成功した AJAX 投稿のエラー メッセージで DIV を更新する AJAX 投稿を行うことにしました。

これに関する問題は、フィールドの横にある ValidationMessage * が入力されないことです。私はまだテストしていない別のアイデアを思いつきましたが、それを機能させるための完全な構文はまだわかっていませんが、皆さんの考えを見てみたいと思いました。

問題になる可能性があると思われる 1 つの問題は、コントローラーの Edit/Create Action メソッドに投稿し、JSON オブジェクトを返したい場合、JSON は GET アクションにのみ使用されるため、それが合法かどうかわからないことです。

良いアイデアだと思い、助けたいと思っている場合は、これを機能させるための回答とコードスニペットを残してください。それが非常に頭の良い計画であり、もっとうまくできると思う場合は、どうすればよいか教えてください.

コントローラ:

if (!ModelState.IsValid)
{
            var err = ModelState.Where(f => f.Value.Errors.Count > 0);    
            if (Request.IsAjaxRequest())
            {
                   return this.Json(err);
            }
            else
            {
                  return View(PostedItem); 
            }
}

意見:

    $(function() {



    $('#createForm').ajaxForm({
        success:fillSummary
    });

    //click events
    $('#btnSave').click( function(){
        $('#createForm').submit();
    });

    function fillSummary(data) 
    {
       //Loop through the modelstate errors returned
        $.each(data)
       {
            //Append Summary DIV with error message
            //Look for span with the ModelState key name and set it to visible
       }           
    }



    <div id="summary">
       <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.")%>
    </div>
    <form action="<%=Url.Action("Create") %>" method="post" id="createForm">

        <fieldset>
            <div>
                 <label for="Title">Title:</label>
                <%= Html.TextBox("Title",Model.Title) %>
                <%= Html.ValidationMessage("Title", "*") %>
                <span id="val_Title" style="display:none">*</span>              
            </div>
   </form>
   <input type="button" value="Save" id="btnSave" />
4

1 に答える 1

1

現在の ASP.NET MVC プロジェクトでは、AJAX に使用する POST アクションが多数あり、検証の問題にも遭遇しました。私がしたことは、次のような各アクションから返されるラッパー オブジェクトを作成することでした...

public class JsonWrapper
{
   public object Data { get; set; }
   public bool IsError { get; set; }
   public string Message { get; set; }
}

アクションの検証でエラーが発生しなかった場合は、返すデータを Data プロパティに配置します。ただし、何らかの検証エラーやその他の例外が発生した場合は、IsError フラグを true に設定し、Message プロパティにエラー メッセージを設定します。次に、アクションの最後に、オブジェクトを JSON にシリアライズして返します (はい、POST アクションからこれを行うことができます)...

return Json(myJsonWrapper);

クライアント側から、私の AJAX POST コードの onSuccess で、エラーをチェックし、次のように必要なアクションを実行します... (コードのこの時点で、サーバーから返されたオブジェクトは既にjQuery によって JS オブジェクトに逆シリアル化されます)

function onSuccess(jsonWrapper) {
    if (!jsonWrapper.IsError) {
        var myDataFromAction = jsonWrapper.Data;
        //Do stuff with my data
    }
    else {
        MessageBox.ShowMessage(jsonWrapper.Message);
    }
}

これはすぐに使用できるシナリオには適合しませんが、概念として同様のことを行うことができます。これで少なくともいくつかのアイデアが得られることを願っています。

于 2009-05-21T13:52:55.357 に答える