जवाबों:
अपनी क्रिया विधि में, JSON (ऑब्जेक्ट) को JSON को आपके पृष्ठ पर वापस करने के लिए लौटाएं।
public ActionResult SomeActionMethod() {
return Json(new {foo="bar", baz="Blech"});
}
तो बस अजाक्स का उपयोग करते हुए एक्शन विधि को कॉल करें। आप ViewPage से किसी सहायक विधि का उपयोग कर सकते हैं जैसे कि
<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>
SomeMethod एक जावास्क्रिप्ट विधि होगी जो तब लौटी हुई Json वस्तु का मूल्यांकन करती है।
यदि आप एक सादे तार को वापस करना चाहते हैं, तो आप केवल ContentResult का उपयोग कर सकते हैं:
public ActionResult SomeActionMethod() {
return Content("hello world!");
}
डिफ़ॉल्ट रूप से ContentResult एक पाठ / सादे को अपने सामग्री टाइप के रूप में देता है।
यह अतिभारनीय है इसलिए आप यह भी कर सकते हैं:
return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");
मुझे लगता है कि आपको अनुरोध के AcceptTypes पर विचार करना चाहिए। मैं अपनी वर्तमान परियोजना में सही सामग्री प्रकार को निम्नानुसार उपयोग कर रहा हूं।
नियंत्रक पर आपकी कार्रवाई अनुरोध ऑब्जेक्ट के अनुसार इसका परीक्षण कर सकती है
if (Request.AcceptTypes.Contains("text/html")) {
return View();
}
else if (Request.AcceptTypes.Contains("application/json"))
{
return Json( new { id=1, value="new" } );
}
else if (Request.AcceptTypes.Contains("application/xml") ||
Request.AcceptTypes.Contains("text/xml"))
{
//
}
फिर आप आंशिक एक्सएचटीएमएल प्रतिक्रिया मामले को पूरा करने के लिए दृश्य के एस्पेक्स को लागू कर सकते हैं।
फिर jQuery में आप इसे टाइप पैरामीटर पासिंग के रूप में ला सकते हैं:
$.get(url, null, function(data, textStatus) {
console.log('got %o with status %s', data, textStatus);
}, "json"); // or xml, html, script, json, jsonp or text
आशा है कि यह जेम्स की मदद करता है
JSON डेटा से निपटने का एक और अच्छा तरीका JQuery getJSON फ़ंक्शन का उपयोग करना है। आप कॉल कर सकते हैं
public ActionResult SomeActionMethod(int id)
{
return Json(new {foo="bar", baz="Blech"});
}
Jquery getJSON विधि से बस विधि ...
$.getJSON("../SomeActionMethod", { id: someId },
function(data) {
alert(data.foo);
alert(data.baz);
}
);
return Json(new {foo="bar", baz="Blech"});
करता है!
मुझे JQuery के साथ MVC अजाक्स GET कॉल को लागू करने के मुद्दों की एक जोड़ी मिली, जिससे मुझे यहां समाधान साझा करने में सिरदर्द हुआ।
JsonRequestBehavior.AllowGet
; इसके बिना MVC HTTP 500 त्रुटि (के साथ) लौटा रहा थाdataType: json
क्लाइंट पर निर्दिष्ट) ।cache: false
$ .Ajax कॉल में , अन्यथा आपको अंततः HTTP 304 प्रतिसाद (HTTP 200 प्रतिक्रियाओं के बजाय) मिलेगा और सर्वर आपके अनुरोध को संसाधित नहीं करेगा।नमूना JQuery:
$.ajax({
type: 'get',
dataType: 'json',
cache: false,
url: '/MyController/MyMethod',
data: { keyid: 1, newval: 10 },
success: function (response, textStatus, jqXHR) {
alert(parseInt(response.oldval) + ' changed to ' + newval);
},
error: function(jqXHR, textStatus, errorThrown) {
alert('Error - ' + errorThrown);
}
});
नमूना MVC कोड:
[HttpGet]
public ActionResult MyMethod(int keyid, int newval)
{
var oldval = 0;
using (var db = new MyContext())
{
var dbRecord = db.MyTable.Where(t => t.keyid == keyid).FirstOrDefault();
if (dbRecord != null)
{
oldval = dbRecord.TheValue;
dbRecord.TheValue = newval;
db.SaveChanges();
}
}
return Json(new { success = true, oldval = oldval},
JsonRequestBehavior.AllowGet);
}
प्रश्न के अन्य आधे उत्तर के लिए, आप कॉल कर सकते हैं:
return PartialView("viewname");
जब आप आंशिक HTML लौटना चाहते हैं। आपको यह तय करने के लिए कुछ रास्ता खोजना होगा कि क्या अनुरोध JSON या HTML चाहता है, शायद एक URL भाग / पैरामीटर पर आधारित है।
एन्कोडिंग ढांचे के साथ वैकल्पिक समाधान
एक्शन रिटर्न जसन
नियंत्रक
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncJson(new SomeVm(){Id = 1,Name ="Inc"});
}
रेजर पेज
@using (var template = Html.Incoding().ScriptTemplate<SomeVm>("tmplId"))
{
using (var each = template.ForEach())
{
<span> Id: @each.For(r=>r.Id) Name: @each.For(r=>r.Name)</span>
}
}
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core()
.Insert
.WithTemplate(Selector.Jquery.Id("tmplId"))
.Html())
.AsHtmlAttributes()
.ToDiv())
एक्शन रिटर्न html
नियंत्रक
[HttpGet]
public ActionResult SomeActionMethod()
{
return IncView();
}
रेजर पेज
@(Html.When(JqueryBind.InitIncoding)
.Do()
.AjaxGet(Url.Action("SomeActionMethod","SomeContoller"))
.OnSuccess(dsl => dsl.Self().Core().Insert.Html())
.AsHtmlAttributes()
.ToDiv())
आप इस बहुत ही उपयोगी लेख पर एक नज़र डालना चाह सकते हैं जो इसे बहुत अच्छी तरह से कवर करता है!
बस सोचा कि यह लोगों को इस समस्या का एक अच्छा समाधान खोजने में मदद कर सकता है।
http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx
PartialViewResult और JSONReuslt को बेस क्लास ActionResult से विरासत में मिला है। इसलिए यदि रिटर्न प्रकार का निर्णय लिया जाता है तो एक्शनResult के रूप में विधि आउटपुट घोषित करें।
public ActionResult DynamicReturnType(string parameter)
{
if (parameter == "JSON")
return Json("<JSON>", JsonRequestBehavior.AllowGet);
else if (parameter == "PartialView")
return PartialView("<ViewName>");
else
return null;
}
उन लोगों के लिए जो MVC 3 में अपग्रेड किए गए हैं, MVC3 और Json का उपयोग करके एक अच्छा तरीका है
public ActionResult GetExcelColumn()
{
List<string> lstAppendColumn = new List<string>();
lstAppendColumn.Add("First");
lstAppendColumn.Add("Second");
lstAppendColumn.Add("Third");
return Json(new { lstAppendColumn = lstAppendColumn, Status = "Success" }, JsonRequestBehavior.AllowGet);
}
}
अनुरोध के आधार पर विभिन्न आउटपुट उत्पन्न करने के लिए लचीला दृष्टिकोण
public class AuctionsController : Controller
{
public ActionResult Auction(long id)
{
var db = new DataContext();
var auction = db.Auctions.Find(id);
// Respond to AJAX requests
if (Request.IsAjaxRequest())
return PartialView("Auction", auction);
// Respond to JSON requests
if (Request.IsJsonRequest())
return Json(auction);
// Default to a "normal" view with layout
return View("Auction", auction);
}
}
Request.IsAjaxRequest()
विधि काफी सरल है: यह केवल जांच करता है HTTP हेडर यदि का मान एक्स-अनुरोधित-साथ शीर्षक है भेजे अनुरोध को देखने के लिएXMLHttpRequest
, जो कि अधिकांश ब्राउज़रों और AJAX फ्रेमवर्क द्वारा स्वचालित रूप से जोड़ा जाता है।
कस्टम एक्सटेंशन विधि यह जांचने के लिए कि अनुरोध json के लिए है या नहीं, ताकि हम इसे कहीं से भी कॉल कर सकें, जैसे Request.sAjaxRequest () एक्सटेंशन विधि:
using System;
using System.Web;
public static class JsonRequestExtensions
{
public static bool IsJsonRequest(this HttpRequestBase request)
{
return string.Equals(request["format"], "json");
}
}