3

I'm trying to use Ajax.BeginForm features.

The form is posted correctly, but I need to retrieve data in json format, from my controller action and refresh a div with the operation result message.

I have found several suggestions here in Stackoverflow, but none is useful.

Here is a suggestion found:

var data = content.get_response().get_object();

But it didn't work for me. And I believe is deprecated up today, functional only for MVC 2 and lower versions. My current MVC version is 3.

Here is a piece of code:

<script type="text/javascript">
   function fnCompleted(data){
    if(data.Success)
    $("#somediv").html(data.StatusMessage).addClass("success");
    else
    $("#somediv").html(data.StatusMessage).addClass("error");
   }
</script>

@{
   var ajaxOptions= new AjaxOptions{
                    OnComplete= "fnCompleted",
                    Url= '@Url.Action("myAction", "myController")',
                    Method= "POST"
 }     

<div id="somediv">/*Here goes the json response*/</div>

using(Ajax.BeginForm(ajaxOptions)){

 @Html.EditorForModel()
 <input type="submit" name="send" value="Send">

}

Here is a piece of my controller action:

[HttpPost]
 public JsonResult myAction(MyModel mymodel)
 {
  try
        {
            if (myModel== null)
                throw new Exception("The model is empty");
            if (!ModelState.IsValid)
                throw new Exception("The model is wrong");

            var found = /*Look for existence of the model in the database*/;
            if(found)
                throw new Exception("Already exists the object");

            /*Operation with the database*/

            var result = Json(
                new
                {
                    Success = true,//success
                    StatusMessage = "Object created successfully"
                });
            return result;
        }
        catch (Exception exception)
        {
            var result = Json(
                new
                {
                    Success = false,//error
                    StatusMessage = exception.Message
                });
            return result;
        }
   }
4

2 に答える 2

7

私たちにとって最良の解釈を得る説明は、次のようになります。

OnComplete と JSON を使用すると、応答はページの DOM に直接埋め込まれます。そのためには、代わりに OnSuccess と OnFailure を使用することをお勧めします。これらは実際には、コントローラー アクションからの JSON 結果を完全に処理します。

私はあなたたちを私を助けたリンクに送ります。それは私が以前に無視したものと同じで、読み続けてジョエル・プラの答えを見つけました。

Ajax.BeginForm で:

new AjaxOptions
{
    **OnFailure** = "onTestFailure",
    **OnSuccess** = "onTestSuccess"
}

スクリプト ブロック:

<script>
//<![CDATA[

function onTestFailure(xhr, status, error) {

    console.log("xhr", xhr);
    console.log("status", status);       

    // TODO: make me pretty
    alert(error);
}

function onTestSuccess(data, status, xhr) {

    console.log("data", data);
    console.log("status", status);
    console.log("xhr", xhr);

    // Here's where you use the JSON object
    //doSomethingUseful(data);
}
于 2013-02-22T14:35:59.653 に答える
0

ビュー OnComplete JS 関数内に結果を格納する方法はありますか?

もちろん、コントローラーから受信したデータを保存する方法は複数あります。backbone.js モデルのようなクライアント側モデルを使用することをお勧めします。

backbone.js モデルを使用すると、適切にフォーマットされた JSON データ オブジェクトとコレクションをクライアント側に格納できます。

もう 1 つの方法は、非表示のブラウザ変数を使用して、少量のデータを非表示の入力コントロールに格納することです。

もう 1 つの方法は、セッション ベースの Cookie を使用することです。

編集: backbone.js のようなクライアント側 MVC が使用されている場合は、現在のビュー デザインに再度アクセスする必要がある場合があります。しかし、長い目で見れば、それは有益だと思います。

于 2013-02-20T00:20:52.863 に答える