জেএসএন বা আংশিক এইচটিএমএল ফিরে আসা এএসপি.নেট এমভিসি নিয়ন্ত্রণকারী ক্রিয়া


406

আমি নিয়ামক পদক্ষেপগুলি তৈরি করার চেষ্টা করছি যা প্যারামিটারের উপর নির্ভর করে JSON বা আংশিক এইচটিএমএল ফিরে আসবে। অবিচ্ছিন্নভাবে কোনও এমভিসি পৃষ্ঠায় ফলাফল ফিরে পাওয়ার সর্বোত্তম উপায় কী?

উত্তর:


519

আপনার ক্রিয়া পদ্ধতিতে আপনার পৃষ্ঠায় জেএসএনকে ফিরিয়ে দিতে জসন (অবজেক্ট) ফিরিয়ে দিন।

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

তারপরে কেবল অজ্যাক্স ব্যবহার করে অ্যাকশন পদ্ধতিতে কল করুন। আপনি ভিউপেজ থেকে সহায়ক সহায়কগুলির একটি ব্যবহার করতে পারেন

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

সামমথোদ একটি জাভাস্ক্রিপ্ট পদ্ধতি হবে যা জেসন বস্তুটি ফিরে আসার মূল্যায়ন করে।

আপনি যদি কোনও সরল স্ট্রিং ফিরে আসতে চান তবে আপনি কেবলমাত্র বিষয়বস্তু ফলাফল ব্যবহার করতে পারেন:

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
যদি আপনি কোনও উত্তর খুঁজে পান, তবে এটি নিজেই প্রশ্নটিতে লিঙ্ক করুন। উত্তরটি সঠিক জিনিস বলে আমি এটি পরীক্ষা করে দেখছি বলেও মনে করি না।
চেরিয়ান


সেই জসন ক্লাসের পুরোপুরি যোগ্যতাসম্পন্ন নাম কী?
জোশ উইথে

112

আমি মনে করি আপনার অনুরোধের গ্রহণযোগ্যতাগুলি বিবেচনা করা উচিত। আমি আমার বর্তমান প্রকল্পে এটি ব্যবহার করছি নীচের হিসাবে সঠিক সামগ্রীর ধরণটি ফেরত দিতে।

নিয়ামকের উপর আপনার ক্রিয়াটি অনুরোধের অবজেক্টের মতো এটি পরীক্ষা করতে পারে

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 এপিআই তৈরির জন্য খুব কার্যকর হতে পারে।
নাথানডি

আমার কন্ট্রোলারে আমার কাছে এর মতো অনেকগুলি পদ্ধতি থাকলে আমি কী আরও সাধারণভাবে এটি করতে পারি এমন কোনও উপায় আছে?
সেফ

জেসন ক্লাসটি কোন নামস্থানে? প্রকল্প.জসনের জন্য নির্ভরতা কত? অগ্রিম ধন্যবাদ
আন্ড্রেই

1
এটি System.Web.Mvc (System.Web.Mvc.dll এ) থেকে জসনরসাল্ট ক্লাস @ আন্ড্রেই
জেমস গ্রিন

আপনাকে ধন্যবাদ, এটি খুঁজে পেয়েছি। নতুন এপিআই প্রতিবিম্বিত করতে উত্তর আপডেট হতে পারে? বিটিডব্লিউ, আমি ডটনেট কোর ব্যবহার করছি যেখানে এটি মাইক্রোসফ্ট Aএএসপনেটকোর.এমভিসি.জেসন রেজাল্ট।
আন্দ্রেই

78

JSON ডেটা নিয়ে কাজ করার আরেকটি দুর্দান্ত উপায় হ'ল JQuery getJSON ফাংশনটি। আপনি কল করতে পারেন

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

জ্যাকারি থেকে জেএসএসন পদ্ধতিটি সহজভাবে পদ্ধতি ...

$.getJSON("../SomeActionMethod", { id: someId },
    function(data) {
        alert(data.foo);
        alert(data.baz);
    }
);

15
এটি প্রশ্নের কোনও উত্তর দেয় না।
অ্যারোনআউট

2
@ অ্যারোনট আসলে প্রথম অংশটি return Json(new {foo="bar", baz="Blech"});!
স্পার্ক করুন

এছাড়াও $। পোষ্ট স্ট্যাকওভারফ্লো. com/ জিজ্ঞাসা / 751218/… বিবেচনা করুন (জেএসএন অক্ষম করতে এএসপি নেট নেট এমভিসি ডিফল্ট নিরাপত্তার কারণে অনুরোধ পান)
গ্রেগ

50

আমি জিউকিরির সাথে এমভিসি আজাক্স জিইটি কলগুলি বাস্তবায়িত করার জন্য বেশ কয়েকটি সমস্যার সন্ধান পেয়েছি যা এখানে আমার মাথাব্যথার কারণ নিয়ে সমাধানগুলি ভাগ করে নেওয়ার কারণ হয়েছে।

  1. এজ্যাক্স কলটিতে "json" ডাটা টাইপ অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন। এটি স্বয়ংক্রিয়ভাবে আপনার জন্য ফেরত জেএসএন বস্তুটি পার্স করবে (প্রদত্ত সার্ভারটি বৈধ জেএসন দেয়)।
  2. অন্তর্ভুক্ত JsonRequestBehavior.AllowGet; এটি ছাড়াই এমভিসি একটি এইচটিটিপি 500 ত্রুটি ( dataType: jsonক্লায়েন্টের সাথে নির্দিষ্ট করে) ফিরিয়ে দিচ্ছিল ।
  3. যোগ cache: false$ .ajax কলে, অন্যথায় আপনি (HTTP 200 প্রতিক্রিয়া পরিবর্তে) পরিণামে পেতে HTTP- র 304 প্রতিক্রিয়া এবং সার্ভার আপনার অনুরোধ প্রক্রিয়া করব না হবে।
  4. অবশেষে, জসন কেস সংবেদনশীল, তাই উপাদানগুলির আবরণটি সার্ভারের পাশে এবং ক্লায়েন্টের সাথে মিলিয়ে নেওয়া দরকার।

নমুনা জিকুয়েরি:

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

13

প্রশ্নের অর্ধেক উত্তর দেওয়ার জন্য, আপনি কল করতে পারেন:

return PartialView("viewname");

আপনি যখন আংশিক এইচটিএমএল ফিরে আসতে চান। অনুরোধটি JSON বা এইচটিএমএল চায় কিনা, সম্ভবত কোনও URL অংশ / প্যারামিটারের ভিত্তিতে সিদ্ধান্ত নেওয়ার জন্য আপনাকে কিছু উপায় খুঁজে বের করতে হবে।


2
সুতরাং প্রশ্নটি কি উত্তরহীন?
সাইমন_উইভার

2
এটি প্রশ্নের উত্তর দেয় না।
অ্যারোনআউট

আর্জাক্স অনুরোধটি সন্ধান করছেন পার্টিশালভিউ ব্যবহার করে এইচটিএমএল পাওয়ার জন্য একটি পৃষ্ঠার রিফ্রেশ দরকার যদি না আপনি অজ্যাক্স কল ব্যবহার করে কোনও ক্রিয়া পদ্ধতি থেকে দৃষ্টি ফিরে না পান
ক্রিস ম্যাকগ্রা

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

অ্যাকশন রিটার্ন এইচটিএমএল

নিয়ামক

    [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

আংশিকভিউ রিসাল্ট এবং জেএসনরউসল্ট বেস ক্লাস অ্যাকশনারসাল্ট থেকে উত্তরাধিকারী। সুতরাং যদি রিটার্নের ধরণটি গতিশীলভাবে পদ্ধতি আউটপুটকে অ্যাকশনারসাল্ট হিসাবে ঘোষণা করে।

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

এটি কী করে সে সম্পর্কে আপনি আরও কিছু তথ্য যুক্ত করতে পারেন?
রিয়েলচিজারর্ড

যেহেতু আপনার কোডটি এটি ফেরত জেএসএন দেখায়, রিটার্নের ধরণটি জাসনআরসাল্ট হওয়া উচিত এবং অ্যাকশন রেজাল্ট নয়
noobprogrammer

0

অনুরোধের ভিত্তিতে বিভিন্ন আউটপুট উত্পাদন করতে নমনীয় পদ্ধতির approach

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 অবকাঠামো দ্বারা যোগ করা হয়।

অনুরোধটি জসনের জন্য কিনা তা যাচাই করার জন্য কাস্টম এক্সটেনশন পদ্ধতিটি যাতে আমরা যেকোন জায়গা থেকে অনুরোধ করতে পারি, অনুরোধ।আইএসএজএক্সআরেক্সেস্ট () এক্সটেনশন পদ্ধতির মতো:

using System;
using System.Web;

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

সূত্র: https://www.saffibooksonline.com/library/view/programming-aspnet-mvc/9781449321932/ch06.html#_javascript_rendering

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.