نظرات مطالب
Protocol Buffers فرمتی برای تبادل دیتا
به این این دلیل گفتم خوب نیست چون برای موضوع جاری (استفاده از Protobuf و GRPC) خوب نیست و گرنه اگر موضوع مقاله "تبدیل Json RESTful به GRPC بود" قطعا این کتابخانه میتوانست بهترین باشد.
حالا چرا میگم خوب نیست؟ چون طبق تصویر زیر که از داکیومنت ریپازیتوریش برداشته شده و کاملا گویاست، grpc-gateway به عنوان یک Reverse Proxy درخواست‌های کلاینت را به GRPC تبدیل و ترجمه میکند و ارتباط Client با سرور همچنان Json RESTful بوده و پس عملا مزایای GRPC و Protobuf رو از بین میبره. اصلا اگر قراره همچنان ارتباط سرور با کلاینت RESTful باشه دیگه چرا GRPC ؟!

 ضمن اینکه الان کتابخانه third-party برای GRPC در اکثر زبان‌ها (# C++, Python, Ruby, Objective-C, PHP, C  و...) وجود داره پس مشکلی بابت عدم پشتیبانی نخواهیم داشت.
قطعا که Json RESTful به این زودی‌ها محبوبیت خودشو از دست نخواهد داد و grpc-gateway هم کاربرد خاص خودش رو خواهد داشت ولی عرض من این هست که با پوشاندن لباس Json RESTful به GRPC اون رو فلج نکنیم! مخصوصا زمانی که امکان استفاده از کتابخانه‌های GRPC رو در تمام کلاینت هامون داریم.


نظرات مطالب
سفارشی سازی ASP.NET Core Identity - قسمت پنجم - سیاست‌های دسترسی پویا
با سلام. اگر از سمت کلاینت dataType از نوع json را به اکشن ارسال کنیم و در پارامترهای اکشن از [FromBody] استفاده کنیم، خاصیت Request.Form برای دریافت پارامترها چه کار باید کرد؟ به نظر می‌رسد خاصیت Request.Form جوابگو نیست.
نظرات مطالب
فعال سازی عملیات CRUD در Kendo UI Grid
- بله. مشکل دارد. خروجی دریافتی این گرید باید با فرمت DataSourceResult به صورت JSON ارسال شود (به صورت JSON ارسال شدن، شامل فرمت اطلاعات و همچنین تنظیم Content-Type آن است). جزئیات این فرمت و علت وجودی آن در مطلب «صفحه بندی، مرتب سازی و جستجوی پویای اطلاعات به کمک Kendo UI Grid» بررسی شده‌اند. به همین جهت در این مثال‌ها از متد ToDataSourceResult کمک گرفته شده‌است (هم در مثال وب API و هم در مثال MVC آن)
- زمانیکه که خطای Invalid JSON primitive را در سمت سرور دریافت می‌کنید، یعنی سمت کلاینت، اطلاعات را با فرمت نادرستی به سمت سرور ارسال می‌کند و این فرمت JSON نیست. یعنی در قسمت DataSource اطلاعات اضافی و یا نادرستی وجود دارند که با View ذکر شده هماهنگ نیستند.

همانطور که عنوان شد، قسمت‌های سمت سرور و سمت کلاینت را با مثال ارسالی هماهنگ کنید و انطباق دهید. اگر وب API است این مثال و اگر MVC است، این مثال.
نظرات مطالب
استفاده از افزونه‌ی jsTree در ASP.NET MVC
برای دریافت JSON، این روزها دیگر کسی از فایل‌های asmx استفاده نمی‌کند. امکان استفاده از ASP.NET Web API با وب فرم‌ها هم وجود دارد. اطلاعات بیشتر
بعد از آن تنها کاری که باید انجام شود، بازگشت مستقیم خروجی GetTreeJson مثال فوق است و سایر مفاهیم آن یکی هست.
نظرات مطالب
صفحه بندی و مرتب سازی خودکار اطلاعات به کمک jqGrid در ASP.NET MVC
«مگه فیلد dumplevel همچین کاری انجام نمیده؟» 
بله. dump level از stack overflow جلوگیری می‌کند. اما جای دیگری است که stack overflow واقعی رخ می‌دهد:
«بررسی خطای Circular References در ASP.NET MVC Json Serialization»
نظرات مطالب
ساخت یک Web API که از عملیات CRUD پشتیبانی می کند
باید نوع داده ارسالی رو مشخص کنید، بعنوان مثال:

function postProduct() {
    var product = { Name: "SampleProduct", Category: "TestCategory", Price: 10.99 };

    $.ajax({
        type: 'POST',
        data: JSON.stringify(product),
        url: "/api/products",
        contentType: "application/json"
    }).done(function (data) {
        var message = data.Name + ' $:' + data.Price;
        alert(message);
    });
}


مطالعه بیشتر
نظرات مطالب
ساخت DropDownList های مرتبط به کمک jQuery Ajax در MVC
سلام
برای من کار نکرد. به عبارتی متد getjson اجرا نمی‌شد.
تا قبل از متد jquery.getjson اجرا میشه. alert رو اجرا کرد. بعد دیگه اجرا نمیشه. تو firebug هم اساسا درخواستی json دیده نمیشه.
jquery-1.8.3 
نظرات مطالب
آشنایی با JSON؛ ساده - خوانا - کم حجم
سلام
JSON رقیبی قوی برای XML محسوب می‌شه، اما به نظر هنوز زود هست که بگیم XML در حال حذف شدن هست. چون هنوز سیستم‌های قدرتمندی متل Microsoft Workflow Generator یا همین RSS که زیاد در طول روز با اون سروکار داریم، بر مبنای این تکنولوژی کار می‌کنند.
مطالب
فرمت کردن اطلاعات نمایش داده شده به کمک jqGrid در ASP.NET MVC
پیشنیاز این بحث مطالعه‌ی مطلب «صفحه بندی و مرتب سازی خودکار اطلاعات به کمک jqGrid در ASP.NET MVC» است و در اینجا جهت کوتاه شدن بحث، صرفا به تغییرات مورد نیاز جهت اعمال بر روی مثال اول اکتفاء خواهد شد.

صورت مساله

می‌خواهیم اطلاعات نمایش داده شده در گرید را به نحوی فرمت کنیم که
الف) اگر id ردیف مساوی 5 بود، رنگ و پس زمینه‌ی آن تغییر کند.
ب) نام محصول، به جزئیات آن لینک شود و این اطلاعات توسط یک jQuery UI Dialog نمایش داده شود.
ج) عدد قیمت با سه رقم جدا کننده همراه باشد.




تکمیل مدل برنامه

مدل قسمت اول صرفا یک محصول بود. مدل قسمت جاری، اطلاعات تولید/تامین کننده آن‌را توسط کلاس Supplier نیز به همراه دارد:
namespace jqGrid02.Models
{
    public class Product
    {
        public int Id { set; get; }
        public string Name { set; get; }
        public decimal Price { set; get; }
        public Supplier Supplier { set; get; }
    }

    public class Supplier
    {
public int Id { set; get; }
        public string CompanyName { set; get; }
        public string Address { set; get; }
        public string PostalCode { set; get; }
        public string City { set; get; }
        public string Country { set; get; }
        public string Phone { set; get; }
        public string HomePage { set; get; }
    }
}

کدهای سمت سرور

کدهای سمت سرور مانند متد GetProducts به همراه صفحه بندی و مرتب سازی پویای آن دقیقا مانند قسمت قبل است.
در اینجا فقط یک اکشن متد جدید جهت بازگشت اطلاعات تولید کننده‌ای مشخص با فرمت JSON، اضافه شده‌است:
        public ActionResult GetGetSupplierData(int id)
        {
            var list = ProductDataSource.LatestProducts;
            var product = list.FirstOrDefault(x => x.Id == id);
            if (product == null)
                return Json(null, JsonRequestBehavior.AllowGet);

            return Json(new
                          {
                              product.Supplier.CompanyName,
                              product.Supplier.Address,
                              product.Supplier.PostalCode,
                              product.Supplier.City,
                              product.Supplier.Country,
                              product.Supplier.Phone,
                              product.Supplier.HomePage
                          }, JsonRequestBehavior.AllowGet);
        }

کدهای سمت کلاینت

صفحه دیالوگی که قرار است اطلاعات تولید کننده را نمایش دهد، یک چنین ساختاری دارد:
<div dir="rtl" id="supplierDialog">
    <span id="CompanyName"></span><br /><br />
    <span id="Address"></span><br />
    <span id="PostalCode"></span>, <span id="City"></span><br />
    <span id="Country"></span><br /><br />
    <span id="Phone"></span><br />
    <span id="HomePage"></span>
</div>
و تغییرات گرید برنامه به شرح زیر است:
    <script type="text/javascript">
        function showSupplierDialog(linkElement, supplierId) {
            //request json data
            $.getJSON('@Url.Action("GetGetSupplierData","Home")', { id: supplierId }, function (data) {
                //set values in dialog
                for (var property in data) {
                    if (data.hasOwnProperty(property)) {
                        $('#' + property).text(data[property]);
                    }
                }
                
                //get link position
                var linkPosition = $(linkElement).offset();
                $('#supplierDialog').dialog('option', 'position', [linkPosition.left, linkPosition.top]);
                //open dialog
                $('#supplierDialog').dialog('open');
            });
        }

        $(document).ready(function () {

            $('#supplierDialog').dialog({
                 autoOpen: false, bgiframe: true, resizable: false, title: 'تولید کننده'
            });

            $('#list').jqGrid({
                // .... مانند قبل
                colNames: ['شماره', 'نام محصول', 'قیمت'],
                //columns model
                colModel: [
                    {
                        name: 'Id', index: 'Id', align: 'right', width: 20,
                        formatter: function (cellvalue, options, rowObject) {
                            var cellValueInt = parseInt(cellvalue);
                            if (cellValueInt == 5) {
                                return "<span style='background: brown; color: yellow'>" + cellvalue + "</span>";
                            }
                            return cellvalue;
                        }
                    },
                    {
                        name: 'Name', index: 'Name', align: 'right', width: 300,
                        formatter: function (cellvalue, options, rowObject) {
                            return "<a href='#' onclick='showSupplierDialog(this, " + rowObject[0] + ");'>" + cellvalue + "</a>";
                        }
                    },
                    {
                        name: 'Price', index: 'Price', align: 'center', width: 50,
                        formatter: 'currency',
                        formatoptions:
                        {
                            decimalSeparator: '.', thousandsSeparator: ',', decimalPlaces: 2, prefix: '$'
                        }
                    }
                ],
                // .... مانند قبل
            });
        });
    </script>
- همانطور که ملاحظه می‌کنید، توسط خاصیت formatter می‌توان عناصر در حال نمایش را فرمت کرد و بر روی نحوه‌ی نمایش نهایی آن‌ها تاثیرگذار بود.
در حالت ستون Id، از یک formatter سفارشی استفاده شده‌است. در اینجا این فرمت کننده به صورت یک callback عمل کرده و پیش از رندر نهایی اطلاعات، مقدار سلول جاری را توسط cellvalue در اختیار ما قرار می‌دهد. در این بین هر نوع فرمتی را که نیاز است می‌توان اعمال کرد و سپس یک رشته را بازگشت می‌دهیم. این رشته در سلول جاری درج خواهد شد.
- اگر مانند ستون Name، نیاز به مقادیر سایر سلول‌ها نیز وجود داشت، می‌توان از آرایه‌ی rowObject استفاده کرد. برای مثال در این حالت، یک لینک که کلیک بر روی آن سبب فراخوانی تابع showSupplierDialog می‌شود، در سلول‌های ستون Name درج خواهند شد. اولین rowObject که در اینجا مورد استفاده است، به ستون اول یا همان Id محصول اشاره می‌کند.
- در ستون Price از یک سری formatter از پیش تعریف شده استفاده شده‌است. نمونه‌ای از آن را در قسمت اول در ستون نمایش وضعیت موجود بودن محصول با تنظیم formatter: checkbox مشاهده کرده‌اید. در اینجا از یک formatter توکار دیگر به نام currency برای کار با مقادیر پولی استفاده شده‌است به همراه تنظیمات خاص آن.
- متد showSupplierDialog طوری تنظیم شده‌است که پس از دریافت Id یک محصول، آن‌را به سرور ارسال کرده و مشخصات تولید کننده‌ی آن‌را با فرمت JSON دریافت می‌کند. سپس در حلقه‌ای که مشاهده می‌کنید، خواص شیء جاوا اسکریپتی دریافتی استخراج و به spanهای supplierDialog انتساب داده می‌شوند. جهت سهولت کار، Id این spanها دقیقا مساوی Id خواص شیء دریافتی از سرور، درنظر گرفته شده‌اند.
- در مورد راست به چپ نمایش داده شدن عنوان دیالوگ، تغییرات CSS ایی لازم است که در قسمت اول بیان شدند.


برای مطالعه بیشتر
لیست کامل فرمت کننده‌های توکار
فرمت کننده‌های سفارشی


کدهای کامل این مثال را از اینجا می‌توانید دریافت کنید
jqGrid02.zip