2014-09-27 73 views
-3

我有一個MVC項目,其中我有一個Json調用控制器。這個調用不會返回任何結果,即使它總是返回true或false。

我的代碼看起來像這樣

Register.cshtml

function registera() { 
    var $email = $('#register-email'), 
     $password = $('#register-password'), 
     $repeatPassword = $('#register-repeatPassword'), 
     $firstname = $('#register-firstname'), 
     $lastname = $('#register-lastname'), 
     $message = $('#message-register'); 

    if ($password.val() != $repeatPassword.val()) { 
     $message.className = 'alert alert-danger'; 
     $message.html("Both passwords must be identical"); 
    } else { 
     $message.className = 'alert'; 
     showLoadingText($message); 

     register($email.val(), $password.val(), $firstname.val(), $lastname.val(), function (data) { 
      if (data.IsValid()) { 
       $message.html(''); 
       $message.className = ''; 
      } else { 
       $message.className = 'alert alert-danger'; 
       $message.html(data.Message()); 
      } 
     }); 
    } 
}; 

的script.js

function register(email, password, firstname, lastname) { 
    $.get("/Account/GetJson_Register", { email: email, password: password, firstname: firstname, lastname: lastname }, function (data) { 
     return data; 
    }, 'json'); 
}; 

AccountController.cs

public ActionResult GetJSON_Register(string email, string password, string firstname, string lastname) 
{ 
    repository.Register(email, password, firstname, lastname); 

    return Error.Instance.Message != "" 
     ? Json(new { IsValid = false, Message = Error.Instance.Message }) 
     : Json(new { IsValid = true, Message = Error.Instance.Message }); 
} 
+1

'回調裏面return'是不一樣的,即使你可能會因爲AJAX異步性質函數返回。你的函數什麼都不返回 – charlietfl 2014-09-27 21:51:47

回答

1

在這種情況下,從異步成功回調「返回」是沒有意義的。在這種情況下,看起來註冊函數對於自己的回調函數缺少一個額外的參數 - 這不是說「數據是空的」,而是從不調用適當的函數。

比較:

function register(email, password, firstname, lastname, callback) { 
    $.get("/Account/GetJson_Register", { email: email, password: password, firstname: firstname, lastname: lastname }, 
      function (data) { 
      // Invoke the callback, supplying the relevant result 
      callback(data); 
      }, 'json'); 
}; 

請注意,上面的代碼使用的包裝在一個愚蠢的方式來顯示一個點。考慮它是否如下所示,其中用戶代碼提供的回調仍然在成功時被調用。這是可行的,因爲參數和功能上下文都不需要改變。

function register(email, password, firstname, lastname, callback) { 
    $.get("/Account/GetJson_Register", { email: email, password: password, firstname: firstname, lastname: lastname }, 
      callback, 'json'); 
}; 

當然,統一的方法是到use Promises而不是手動回調包裝。在這種情況下,因爲$.get已經返回一個承諾的代碼可以寫像這樣:

function register(email, password, firstname, lastname) { 
    // Return $.Promise returned from $.get as created by the wrapped $.ajax.. 
    return $.get("/Account/GetJson_Register", 
       { email: email, password: password, firstname: firstname, lastname: lastname }, 
       'json'); 
}; 

function showError (message) { 
    $message.className = 'alert alert-danger'; 
    $message.html(message); 
} 

register($email.val(), $password.val(), $firstname.val(), $lastname.val()) 
    .done(function (data) { 
     if (data.IsValid) { 
      $message.html(''); 
      $message.className = ''; 
     } else { 
      // This should be .Message and not .Message(), etc. 
      showError(data.Message); 
     } 
    }) 
    // It is also good to handle cases when a non-200 OK occurs 
    .fail(function (xhr, message) { 
     showError("Registration failed: " + message); 
    });