ajax एएसपी.नेट एमवीसी नियंत्रक क्रियाएँ जो जेएसओएन या आंशिक एचटीएमएल लौटाती हैं




asp.net-mvc json (9)

मैं नियंत्रक क्रियाएं बनाने की कोशिश कर रहा हूं जो पैरामीटर के आधार पर या तो JSON या आंशिक HTML लौटाएंगे। परिणाम को एमवीसी पृष्ठ पर असीमित रूप से वापस लाने का सबसे अच्छा तरीका क्या है?


अनुरोध के आधार पर विभिन्न आउटपुट का उत्पादन करने के लिए लचीला दृष्टिकोण

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 फ्रेमवर्क द्वारा स्वचालित रूप से जोड़ा जाता है।

यह जांचने के लिए कस्टम एक्सटेंशन विधि है कि अनुरोध जेसन के लिए है या नहीं, ताकि हम इसे कहीं से भी कॉल कर सकें, जैसे Request.IsAjaxRequest () एक्सटेंशन विधि:

using System;
using System.Web;

public static class JsonRequestExtensions
{
  public static bool IsJsonRequest(this HttpRequestBase request)
  {
    return string.Equals(request["format"], "json");
  }
}

स्रोत: https://www.safaribooksonline.com/library/view/programming-aspnet-mvc/9781449321932/ch06.html#_javascript_rendering


प्रश्न के दूसरे भाग का जवाब देने के लिए, आप कॉल कर सकते हैं:

return PartialView("viewname");

जब आप आंशिक HTML वापस करना चाहते हैं। आपको यह तय करने के लिए कुछ रास्ता तय करना होगा कि अनुरोध जेएसओएन या एचटीएमएल चाहता है, शायद यूआरएल भाग / पैरामीटर के आधार पर।


मुझे लगता है कि आपको अनुरोध के स्वीकार्य प्रकारों पर विचार करना चाहिए। मैं अपने वर्तमान प्रोजेक्ट में निम्न सामग्री प्रकार को वापस करने के लिए इसका उपयोग कर रहा हूं।

नियंत्रक पर आपकी कार्रवाई अनुरोध ऑब्जेक्ट के रूप में इसका परीक्षण कर सकती है

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"))
{
   //
}

इसके बाद आप आंशिक xhtml प्रतिक्रिया केस को पूरा करने के लिए दृश्य के एएसपीएक्स को कार्यान्वित कर सकते हैं।

फिर 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);
    }
);

इंकोडिंग ढांचे के साथ वैकल्पिक समाधान

एक्शन रिटर्न जेसन

नियंत्रक

    [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())

एक्शन रिटर्न एचटीएमएल

नियंत्रक

    [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())

एमवीसी 3 में अपग्रेड किए गए लोगों के लिए यहां एमवीसी 3 और जेसन का उपयोग करने का एक साफ तरीका है


PartialViewResult और JSONReuslt बेस क्लास ActionResult से प्राप्त होता है। इसलिए अगर रिटर्न प्रकार का निर्णय लिया जाता है तो गतिशील रूप से एक्शन रिसेट के रूप में विधि आउटपुट घोषित करें।

public ActionResult DynamicReturnType(string parameter)
        {
            if (parameter == "JSON")
                return Json("<JSON>", JsonRequestBehavior.AllowGet);
            else if (parameter == "PartialView")
                return PartialView("<ViewName>");
            else
                return null;


        }

मुझे एमवीसी अजाक्स को लागू करने में कुछ समस्याएं मिलीं जो JQuery के साथ कॉल करती हैं जिसने मुझे सिरदर्द को यहां समाधान साझा करने का कारण बना दिया।

  1. AJAX कॉल में डेटा प्रकार "जेसन" शामिल करना सुनिश्चित करें। यह स्वचालित रूप से आपके लिए लौटाए गए JSON ऑब्जेक्ट को पार्स करेगा (सर्वर को वैध जेसन लौटाता है)।
  2. JsonRequestBehavior.AllowGet शामिल करें; इस एमवीसी के बिना एक HTTP 500 त्रुटि लौटा रहा था ( dataType: json साथ dataType: json क्लाइंट पर dataType: json निर्दिष्ट)।
  3. cache: false जोड़ें cache: false $ .ajax कॉल पर cache: false , अन्यथा आपको अंततः HTTP 304 प्रतिक्रियाएं मिलेंगी (HTTP 200 प्रतिक्रियाओं के बजाय) और सर्वर आपके अनुरोध को संसाधित नहीं करेगा।
  4. अंत में, जेसन केस संवेदनशील है, इसलिए तत्वों के आवरण को सर्वर की तरफ और क्लाइंट साइड पर मिलान करने की आवश्यकता है।

नमूना 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);
  }
});

नमूना एमवीसी कोड:

[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);
}

अपनी क्रिया विधि में, जेएसओएन (ऑब्जेक्ट) को अपने पृष्ठ पर जेएसओएन वापस करने के लिए वापस करें।

public ActionResult SomeActionMethod() {
  return Json(new {foo="bar", baz="Blech"});
}

फिर अजाक्स का उपयोग करके एक्शन विधि को कॉल करें। आप व्यूपेज से एक सहायक तरीके का उपयोग कर सकते हैं जैसे कि

<%= Ajax.ActionLink("SomeActionMethod", new AjaxOptions {OnSuccess="somemethod"}) %>

कुछ विधि एक जावास्क्रिप्ट विधि होगी जो उसके बाद जेसन ऑब्जेक्ट का मूल्यांकन करेगी।

यदि आप एक सादा स्ट्रिंग वापस करना चाहते हैं, तो आप केवल ContentResult का उपयोग कर सकते हैं:

public ActionResult SomeActionMethod() {
    return Content("hello world!");
}

डिफ़ॉल्ट रूप से ContentResult एक सामग्री / सादा अपनी सामग्री के रूप में देता है टाइप करें।
यह अधिभार योग्य है ताकि आप यह भी कर सकें:

return Content("<xml>This is poorly formatted xml.</xml>", "text/xml");




asp.net-ajax