Asp.net-Mvc

將 Json 對像從控制器操作返回到 jQuery

  • March 17, 2017

我正試圖讓它正常工作(現在 2 天)。我正在登錄,我從 jQuery 呼叫控制器操作,向其傳遞 JSON 對象(使用 json2.js)並從控制器返回 Json 對象。我可以很好地呼叫該操作,但不能將響應放在我想要的位置,它只是打開一個新視窗,並在螢幕上列印:

{"Message":"Invalid username/password combination"}

URL 看起來像http://localhost:13719/Account/LogOn所以不是呼叫操作而不是重新載入頁面,而是將使用者帶到控制器,這不好。

所以現在對於一些程式碼,首先是控制器程式碼

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl = "")
{
   if (ModelState.IsValid)
   {
       var login = ObjectFactory.GetInstance<IRepository<PhotographerLogin>>();

       var user = login.FindOne(x => x.Login == model.Username && x.Pwd == model.Password);

       if (user == null)
           return Json(new FailedLoginViewModel { Message = "Invalid username/password combination" });
       else
       {
           if (!string.IsNullOrEmpty(returnUrl)) 
               return Redirect(returnUrl);
           else 
               return RedirectToAction("Index", "Home");
       }
   }
   return RedirectToAction("Index", "Home");
}

和 jQuery 程式碼

$("#signin_submit").click(function () {
   var login = getLogin();
   $.ajax({
       type: "POST",
       url: "../Account/LogOn",
       data: JSON.stringify(login),
       dataType: 'json',
       contentType: 'application/json; charset=utf-8',
       error: function (xhr) {
           $("#message").text(xhr.statusText);
       },
       success: function (result) {

       }
   });
});

function getLogin() {
   var un = $("#username").val();
   var pwd = $("#password").val();
   var rememberMe = $("#rememberme").val();

   return (un == "") ? null : { Username: un, Password: pwd, RememberMe: rememberMe };
}

如果您還需要在此處查看實際的登錄表單

<fieldset id="signin_menu">
   <div>
       <span id="message"></span>
   </div>
   <% Html.EnableClientValidation(); %>    
   <% using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { @id = "signin" }))
       {%>

       <% ViewContext.FormContext.ValidationSummaryId = "valLogOnContainer"; %>
       <%= Html.LabelFor(m => m.Username) %>
       <%= Html.TextBoxFor(m => m.Username, new { @class = "inputbox", @tabindex = "4", @id = "username" })%><%= Html.ValidationMessageFor(m => m.Username, "*")%>
       <p>
       <%= Html.LabelFor(m=>m.Password) %>
       <%= Html.PasswordFor(m => m.Password, new { @class = "inputbox", @tabindex = "5", @id = "password" })%><%= Html.ValidationMessageFor(m => m.Password, "*")%>
       </p>
       <p class="remember">
       <input id="signin_submit" value="Sign in" tabindex="6" type="submit"/>
       <%= Html.CheckBoxFor(m => m.RememberMe, new { @class = "inputbox", @tabindex = "7", @id = "rememberme" })%>
       <%= Html.LabelFor(m => m.RememberMe) %>
       <p class="forgot"> <a href="#" id="forgot_password_link" title="Click here to reset your password.">Forgot your password?</a> </p>
       <p class="forgot-username"> <a href="#" id="forgot_username_link" title="Fogot your login name? We can help with that">Forgot your username?</a> </p>
       </p>
       <%= Html.ValidationSummaryJQuery("Please fix the following errors.", new Dictionary<string, object> { { "id", "valLogOnContainer" } })%>
   <% } %>
</fieldset>

登錄表單載入在首頁上

<% Html.RenderPartial("LogonControl");%>

不確定這是否與此有關,但我想我會提到它。

**編輯:**登錄表單的載入類似於 Twitter 登錄,點擊連結並在 jQuery 和 CSS 的幫助下載入表單

您的操作簽名將如下所示:

public virtual JsonResult ActionName()
{
    var abcObj = new ABC{a=1,b=2};

    return Json(abcObj);
}

如果您使用的是 MVC 2,則必須返回如下內容:

return Json(your_object, JsonRequestBehavior.AllowGet);

我在這裡找到了

對於不同的用法,這是我的程式碼。

查詢:

$(document).ready(function () {
   $("#InputDate").live('click', function () {
       var date = $("#InputDate").val();
       if (date != "") {
           $.getJSON("/Home/GetNames",
                   { date: $("#InputDate").val() },
                   function (data) {
                       $("#ProviderName").empty();
                       // [...]
                       });
                   });
       }
   });
});

和 C#

public JsonResult GetNames(string date)
{
  List<Provider> list = new List<Provider>();
  // [...]
  return Json(list, JsonRequestBehavior.AllowGet);
}

引用自:https://stackoverflow.com/questions/4564341