从同一个控制器动作返回List作为Json和viewbag

时间:2013-04-30 12:52:36

标签: asp.net-mvc asp.net-mvc-3 jquery

我正在开发asp.net MVC 3 applciation。我有一个jquery ui对话框。在这个对话框的Ok按钮上,我打开另一个jquery ui对话框。为了填充新打开的弹出窗口,我使用了返回集合的jquery ajax调用。我正在使用此集合来创建表行。代码在这里:

$("#Prices").dialog({
   autoOpen: false,
   autoResize: true, buttons: {
      "OK": function () {       
         var PirceCurrencies = $('#PirceCurrencies').val();                      
         jQuery("#hdCurrencyId").val(PirceCurrencies);                           
         jQuery(this).dialog('close');
         $.ajax({
            type: "POST",
            dataType: "json",
            url: "/Home/GetRecordingRates",
            data: { Id: $("#hdCurrencyId").val() },
            success: function (data) {                           
               $("#results").find("tr:gt(0)").remove();
               var messages = data.Result;                       
               $.each(messages, function(k, v) {   
                  var row = $('<tr>');                   
                  row.append($('<td>').html(v.DialPrefix));
                  row.append($('<td>').html(v.Rate)); 
                  $('#results').append(row);                                                                                                  
               });
               jQuery('#RecordingRates').dialog({ closeOnEscape: false });
               $(".ui-dialog-titlebar").hide();
               $("#RecordingRates").dialog({ dialogClass: 'transparent' });
               $('#RecordingRates').dialog('open');
            }
         }); 
      }
   },
   open: function () {
      $('.ui-dialog-buttonset').find('button:contains("OK")').focus();
      $('.ui-dialog-buttonset').find('button:contains("OK")').addClass('customokbutton');
   }
});

和控制器操作是:

public JsonResult GetRecordingRates(int Id)
{
   List<DefaultRateChart> defaultRateCharts = new List<DefaultRateChart>();
   Currency currency = new Currency();

   using (IDefaultRateChartManager defaultRateChartManager = new ManagerFactory().GetDefaultRateChartManager())
   {
      defaultRateCharts = defaultRateChartManager.GetAll().Where(rc => rc.Currency.Id == Id
            && (!rc.NumberPrefix.StartsWith("#") && !rc.NumberPrefix.Equals("Subscription")
            && !rc.NumberPrefix.Equals("Default")) && rc.AccountCredit == "Credit").ToList();
   }

   using (ICurrencyManager currencyManager = new ManagerFactory().GetCurrencyManager())
   {
      currency = currencyManager.GetById(Id);
      ViewBag.currecycode = currency.CurrencyCode;
      ViewBag.countrycode = currency.CountryCode;
   }

   return this.Json( new {
      Result = ( from obj 
                 in defaultRateCharts 
                 select new { 
                    Id = obj.Id, 
                    DialPrefix = obj.NumberPrefix, 
                    Rate = obj.PurchaseRates  
                 }
               )
   }, JsonRequestBehavior.AllowGet);
}

这一切都运行正常,但我需要在新打开的弹出窗口上显示其他数据,而不是填充/创建html表格行的集合。堡垒,我需要进行另一个ajax调用另一个控制器动作,将返回数据?

请建议

3 个答案:

答案 0 :(得分:1)

看看你现在在控制器中返回的内容:

new {
    Result = ( ... )
}

您将返回一个名为Result的属性为1的对象。在您的javascript代码中,您获得该对象返回的命名数据,并将Result属性作为列表检索。

是什么阻止您向该列表添加更多属性?

new {
    result = ( ... ),
    currencyCode = currency.CurrencyCode,
    countryCode = currency.CountryCode
}

在javascript中,您可以使用data.currencyCodedata.countryCode

答案 1 :(得分:0)

根据控制器操作方法,您可以像下面一样返回字典。

示例代码 - C#

var dic = new List<KeyValuePair<short, object>>
{
    new KeyValuePair<Int16, object>(1, SomeObj),
    new KeyValuePair<Int16, object>(2, SomeObj),
    new KeyValuePair<short, object>(3, SomeObj),  
    new KeyValuePair<Int16, object>(4, SomeObj)
};

return Json(dic, JsonRequestBehavior.AllowGet);

示例代码 - JQuery-访问字典对象

var obj1; //Global Variables
var obj2; //Global Variables
var obj3; //Global Variables
var obj4; //Global Variables

$.ajax({
    url: url,
    async: true,
    type: 'GET',
    data: JSON.stringify({ Parameter: Value }),
    beforeSend: function (xhr, opts) {
    },
    contentType: 'application/json; charset=utf-8',
    complete: function () { },
    success: function (data) {
        DataSources(data);
    }
});

function DataSources(dataSet) {
    obj1 = dataSet[0].Value; //Access Object 1
    obj2 = dataSet[1].Value; //Access Object 2
    obj3 = dataSet[2].Value; //Access Object 3
    obj4 = dataSet[3].Value; //Access Object 4
}

答案 2 :(得分:0)

从控制器返回一个字典。 将您的集合转换为字符串,将其他对象转换为字符串并返回

dictionary<int, string>

在你的javascript成功函数中,

JSON.parse(data[0].key) will give you your collection

这会给你一个想法

    bool inCart = false;
Cart MyCart = default(Cart);
Dictionary<string, string> Result = new Dictionary<string, string>();
Result.Add("inCart", inCart.ToString().ToLower());
Result.Add("cartText", MyCart.CartText());
string ResultString = new JavaScriptSerializer().Serialize(Result);
return ResultString;

这里我将两个类型添加到字典并返回我的序列化字典