2010-12-30 11 views
12

पर जेसन ऑब्जेक्ट लौट रहा है मैं इसे ठीक से काम करने का प्रयास कर रहा हूं (2 दिन अब)। मैं एक लॉग पर काम कर रहा हूं जहां मैं jQuery से नियंत्रक कार्रवाई को बुला रहा हूं, इसे एक JSON ऑब्जेक्ट पास कर रहा हूं (json2.js का उपयोग कर रहा हूं) और नियंत्रक से एक जेसन ऑब्जेक्ट लौटा रहा हूं।कंट्रोलर एक्शन से jQuery

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

और यूआरएल http की तरह दिखता है: मैं कार्रवाई ठीक कॉल करने के लिए, लेकिन इसके बजाय प्रतिक्रिया जहाँ मैं यह चाहते डाल करने के लिए यह सिर्फ इस स्क्रीन पर मुद्रित के साथ एक नई विंडो खोलता में सक्षम होने के लिए सक्षम हूँ : // localhost: 13719/खाता/लॉगऑन इसलिए कार्रवाई को कॉल करने और पृष्ठ को फिर से लोड करने के बजाय यह उपयोगकर्ता को नियंत्रक को ले जा रहा है, जो अच्छा नहीं है।

तो अब कुछ कोड, पहले नियंत्रक कोड

[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");%> 

सुनिश्चित नहीं है कि इसका इस पर कोई असर पड़ता है या नहीं, लेकिन सोचा कि मैं इसका उल्लेख करूंगा।

संपादित करें: लॉगिन प्रपत्र ट्विटर लॉगिन के समान ही भरी हुई है,

उत्तर

2

के बारे में @ user350374 क्या मैं कुछ फेरबदल किया था और करने के लिए अपने मूल समाधान संशोधित बजाय मेरी कार्रवाई JsonResult के हस्ताक्षर बनाने ActionResult के बारे में कहा सोच JsonResult का उपयोग करें और कार्रवाई में बजाए jQuery में सभी जांच/पुनर्निर्देशन किया।

मेरे कार्रवाई

[HttpPost,MoveFormsScript] 
public JsonResult 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 LoginResult { Success = false, Message = "Invalid login" }); 
     else 
     { 
      return Json(new LoginResult 
      { 
       Success = true, 
       Message = "Redirecting...", 
       ReturnUrl = (!string.IsNullOrEmpty(returnUrl)) ? returnUrl : string.Format("Account/Index/{0}", user.Photographer.Key) 
      }); 
     } 
    } 
    else 
    { 
     return Json(new LoginResultDTO { Success = false, Message = "Incomplete fields" }); 
    } 

} 

करने के लिए बदल और मेरे jQuery कॉल

$("#signin_submit").click(function() { 
    var f = $($("form")[0]); 
    f.submit(function() { 
     var loginData = f.serialize(); 
     $.post(f.attr("action"), loginData, function (result, status) { 
      if (!result.Success) { 
       $("#message").text(result.Message); 

       $("#username").focus(); 
       $("#username").select(); 
      } 
      else { 
       window.location.replace(result.ReturnUrl); 
      } 

     }, "json"); 
     return false; 
    }); 
}); 

LoginResult करने के लिए सिर्फ भागों धारण करने के लिए

public class LoginResult 
{ 
    public bool Success { get; set; } 
    public string Message { get; set; } 
    public string ReturnUrl { get; set; } 
} 

टिप के लिए धन्यवाद एक साधारण वर्ग है @ user35037, अब मेरे पास इस तक पहुंचने के 2 तरीके हैं भविष्य।

+0

मेरी खुशी प्राप्त करता है। और एक विस्तृत समाधान पोस्ट करने के लिए धन्यवाद .. – Baz1nga

+0

@psycho मुझे यहां एक ही समस्या थी। इस तथ्य के अलावा कि जब jQuery के माध्यम से कॉल किया जाता है तो ActionResult के रूप में रीडायरेक्ट काम नहीं करेगा, मुख्य कारण यह है कि आपका पहला कोड "जेसन फ़ाइल" लौटा रहा है क्योंकि आपके पास सबमिट फ़ंक्शन में 'वापसी झूठ नहीं है', इस प्रकार, JSON को "फ़ाइल" के रूप में वापस कर रहा है। –

9

आप MVC 2 का उपयोग कर रहे हैं, तो आप कुछ भी वापस लौटाना होगा jQuery & सीएसएस की मदद से एक लिंक और फार्म लोड क्लिक करें इस तरह:

return Json(your_object, JsonRequestBehavior.AllowGet); 

मैंने पाया यह here

एक अलग उपयोग के लिए, यहाँ मेरी कोड है।

JQuery:

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

और सी #

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

धन्यवाद आप केरबिन, यह केवल एमवीसी 2 के लिए नहीं है, यह एमवीसी 3,4 और 5 –

2

ठीक एक संकल्प है कि मैंने सोचा था कि मैं यहाँ साझा करते हैं मामले में किसी को एक simliar मुद्दे के साथ साथ आता है के साथ आया था। $ .ajax उपयोग करने के बजाय मैं $ .post उपयोग करने के लिए बंद कर और इस तरह देखने के लिए मेरी jQuery कोड बदल गया है और सब कुछ अभी जिस तरह मैं शुरू में करने के लिए यह उम्मीद काम करता है:

$("#signin_submit").click(function() { 
    var f = $($("form")[0]); 
    f.submit(function() { 
     var loginData = f.serialize(); 
     $.post(f.attr("action"), loginData, function (result, status) { 
      if (!result.Success) { 
       $("#message").text(result.Message); 
      } 
     }, "json"); 
     return false; 
    }); 
}); 

सब जो देखा के लिए धन्यवाद मेरे प्रश्न पर, और @ केरबिन के रूप में मैं उस मुद्दे से अनजान था।

12

आपकी कार्रवाई हस्ताक्षर के रूप में दिखाई देगा इस प्रकार है:

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

    return Json(abcObj); 
} 
+0

के लिए धन्यवाद टिप के लिए धन्यवाद, लेकिन मेरे पास _ActionResult_ है क्योंकि यह वैध लॉगिन है तो मैं एक दृश्य पर रीडायरेक्ट करता हूं। – PsychoCoder

+0

हम आपको सर्वर से किसी भी प्रकार का अधिकार वापस कर सकते हैं और मुझे लगता है कि जेसन सबसे अच्छा कॉस है जिसे आप जेएसन के रूप में आंशिक दृश्य को क्रमबद्ध कर सकते हैं और उसे क्लाइंट को वापस भेज सकते हैं और संभवतः जेसन को एक आधिकारिक संपत्ति जोड़ सकते हैं जिस पर आप wat चुनते हैं पेज पर प्रस्तुत करने के लिए। – Baz1nga

+0

इसके अलावा यदि आप ऐसा नहीं करना चाहते हैं कि आप क्या कर सकते हैं तो यह है कि यदि उपयोगकर्ता सफलतापूर्वक लॉगिन करता है तो आप एक और कॉल frm जेएस ट्रिगर करते हैं जो आंशिक दृश्य – Baz1nga

संबंधित मुद्दे