ASP.NET MVC नियंत्रक क्रियाएँ जो JSON या आंशिक html लौटाती हैं


406

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

जवाबों:


519

अपनी क्रिया विधि में, 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");

9
क्षमा करें! यह वास्तव में इस सवाल का जवाब नहीं करता है? यह निश्चित रूप से उपयोगी है, लेकिन जैसा कि ब्रैड कहते हैं कि आपको किसी तरह यह पता लगाने की आवश्यकता है कि वे क्या मांग रहे हैं और तदनुसार परिणाम वापस करें।
सिमोन_वेर

मेरे कुछ संबंधित देखें (अच्छी तरह से जो मुझे यहाँ ले गए) सवाल stackoverflow.com/questions/482363/… पर
Simon_Weaver

9
यदि आपको कोई उत्तर मिलता है, तो इसे प्रश्न में ही लिंक करें। इसके अलावा, मुझे नहीं लगता कि यह जांचना सही है क्योंकि जवाब सही है।
चेरियन


उस Json वर्ग का पूरी तरह से योग्य नाम क्या है?
जोश विटहे

112

मुझे लगता है कि आपको अनुरोध के 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

आशा है कि यह जेम्स की मदद करता है


5
धन्यवाद जेम्स, जो एक ही नियंत्रक क्रियाओं का उपयोग करके एक वेबसाइट और REST API बनाने के लिए बहुत उपयोगी हो सकता है।
NathanD

अगर मेरे पास कई तरीके हैं जैसे कि मेरे नियंत्रक में कोई तरीका है कि मैं इसे और अधिक उदारतापूर्वक कर सकता हूं?
सिपाही

JSON वर्ग किस नाम स्थान पर है? Project.json के लिए निर्भरता क्या है? अग्रिम धन्यवाद
आंद्रेई


धन्यवाद, मिल गया। शायद नए एपीआई को प्रतिबिंबित करने के लिए उत्तर को अपडेट करें? Btw, मैं डॉटनेट कोर का उपयोग कर रहा हूँ जहाँ यह Microsoft.AspNetCore.Mvc.JsonResult है।
आंद्रेई

78

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

15
यह प्रश्न का उत्तर नहीं देता है।
एरोन

2
@Aaronaught वास्तव में पहला भाग return Json(new {foo="bar", baz="Blech"});करता है!
स्पार्क

इसके अलावा $ .post stackoverflow.com/questions/751218/… पर विचार करें (JSON को निष्क्रिय करने के लिए ASP.Net MVC चूक सुरक्षा कारणों से अनुरोध प्राप्त करें)
ग्रेग

50

मुझे JQuery के साथ MVC अजाक्स GET कॉल को लागू करने के मुद्दों की एक जोड़ी मिली, जिससे मुझे यहां समाधान साझा करने में सिरदर्द हुआ।

  1. अजाक्स कॉल में डेटा प्रकार "जोंस" को शामिल करना सुनिश्चित करें। यह स्वचालित रूप से आपके लिए दिए गए JSON ऑब्जेक्ट को पार्स कर देगा (दिए गए सर्वर रिटर्न को वैध json देता है)।
  2. शामिल करें JsonRequestBehavior.AllowGet; इसके बिना MVC HTTP 500 त्रुटि (के साथ) लौटा रहा थाdataType: json क्लाइंट पर निर्दिष्ट) ।
  3. जोड़ना cache: false$ .Ajax कॉल में , अन्यथा आपको अंततः 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);
  }
});

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

13

प्रश्न के अन्य आधे उत्तर के लिए, आप कॉल कर सकते हैं:

return PartialView("viewname");

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


2
तो सवाल अनुत्तरित नहीं रहता है?
साइमन_वेर

2
इस सवाल का जवाब नहीं है।
Aaronaught

वह अजाक्स अनुरोध के लिए देख रहा है। html का उपयोग करके PartialView का उपयोग करके पृष्ठ को ताज़ा करने की आवश्यकता होती है जब तक कि आप एजाक्स कॉल का उपयोग करके एक एक्शन विधि से दृश्य वापस नहीं करते हैं
क्रिस मैकग्राथ

7

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

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

नियंत्रक

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

6

आप इस बहुत ही उपयोगी लेख पर एक नज़र डालना चाह सकते हैं जो इसे बहुत अच्छी तरह से कवर करता है!

बस सोचा कि यह लोगों को इस समस्या का एक अच्छा समाधान खोजने में मदद कर सकता है।

http://weblogs.asp.net/rashid/archive/2009/04/15/adaptive-rendering-in-asp-net-mvc.aspx


4

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;


        }


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

क्या आप इसके बारे में थोड़ी और जानकारी जोड़ सकते हैं?
RealCheeseLord

चूंकि आपका कोड दिखाता है कि यह JSON है, इसलिए रिटर्न प्रकार JsonResult होना चाहिए न कि ActionResult
noobprogrammer

0

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.