2012-08-13 163 views
1

腳本:從控制器獲取json數據?

<script type="text/javascript"> 
function getMeterInfo(meter_id) { 
    $.ajax({ 
     url: '@Url.Action("MeterInfo", "Power")', 
     data: { meter_id: meter_id}, 
     dataType: "json", 
     type: "GET", 
     error: function() { 
      alert("Error!"); 
     }, 
     success: function (data) { 
      var item = ""; 
      item += data.sno + " " + data.customer_id + data.city + data.region; //+ more info about meter. 

      $("#meter_info").html(item); 
     } 
    }); 
} 

$(document).ready(function() { 
    $("#meters").change(function() { 
     var meter_id = $("#meters").val(); 
     getMeterInfo(meter_id); 
    }); 
}); 
</script> 

注:我知道成功的功能的內容是不正確的。我不知道,我可以在那裏寫什麼。

CSHTML

@Html.DropDownList("sno", new SelectList(Model, "sno", "meter_name"), "-- Select Meter --", new { id = "meters" }) 

<table id=meter_info> 
</table> 

控制器

[HttpGet] 
public ActionResult MeterInfo(string meter_id) 
{ 
    int _meter_id = Int32.Parse(meter_id); 
    var _meter = entity.TblMeters.Where(x => x.sno == _meter_id).FirstOrDefault(); 

    return Json(_meter, JsonRequestBehavior.AllowGet); 
} 

型號

public class TblMeters 
{ 
     int sno; 
     int customer_id; 
     string city; 
     string region; 
     ..... 
} 

我想告訴我的模型值(SNO,CUSTOMER_ID,城市,區域等)中一個html表格。當我調試程序時,Controller操作返回預期的數據。

  1. 我不知道我怎麼才能顯示返回的數據項目名稱是meter_info。
  2. 當我運行上面的代碼時,Error函數起作用,而不是成功函數。

如何在表格上顯示數據?爲什麼錯誤功能起作用?

謝謝。

回答

1

我在想你的序列化是否正常工作。會發生什麼,如果你改變了這個:

return Json(_meter, JsonRequestBehavior.AllowGet); 

return Json(new { sno = _meter.sno, customer_id = _meter.customer_id etc. }, JsonRequestBehavior.AllowGet); 

而且,這將真正幫助,如果你可以檢查開發人員工具欄(在大多數瀏覽器的F12)網絡選項卡檢查什麼是響應。

更新

您可以檢查你的數據是如何序列化。如果你使用內置的串行器/解串器,那麼你可以嘗試這樣的事情。

var serializer = new JavaScriptSerializer(); 
var json = serializer.Serialize(yourData); 

隨着JSON.NET

var json = JsonConvert.SerializeObject(yourData, jsonSerializerSettings); 
+0

非常感謝。這是解決方案。部分視圖也是好的解決方案嗎?我應該選擇哪一個? – 2012-08-14 06:30:34

+0

@AliRızaAdıyahşi這是一個味道和要求的問題。如果您返回JSON,那麼您可以爲其他客戶端使用相同的數據,例如原生移動設備應用程序只是以不同的方式呈現它。或者你可以在我的Meter類中使用公共API – Tx3 2012-08-14 06:32:36

+0

有25個值。如果我使用這種方法,Json函數將會增長。 – 2012-08-14 06:37:19

1

你能否驗證成功函數是否被螢火蟲等等調用...?或者只是在那裏放一個警報('打電話!')在那裏?

而且除了:

1)你貼下面的代碼使用稱爲項目和另一個叫項目一個變量。是你的意圖,因爲你設置內部的html爲空字符串。

var **item** = ""; 
    **items** += data.sno + " " + data.customer_id + data.city + data.region; 

    $("#meter_info").html(**item**); 

2)如果你想通過的結果迴路,並添加一個錶行的每個結果:你想使用jQuery「每個」對於這一點,但在進一步檢查,它看起來像你只是顯示一個通過這個結果記錄。奇怪的是,您正在使用表格來只顯示一行。

要添加一個結果(當然,你可能會想這個分成多列):

$('#meter_info').append('<tr><td>' + data.sno 
      + ' ' + data.customer_id + data.city + data.region + '</td></tr>' 

如果你想返回並添加多行:

$.each(data, function(index,data){$('#meter_info').append('<tr><td>' + data.sno 
     + ' ' + data.customer_id + data.city + data.region + '</td></tr>' }; 
+0

它仍然進入錯誤的功能。我找不到這個錯誤。 – 2012-08-14 06:07:50

1

如果它是一個選項,我建議使用不顯眼的AJAX來實現這一點。它需要很多工作,併爲你做。

因此,根據您嘗試的內容,您希望創建一個強類型的部分視圖,該視圖接受TableMeters列表,因爲它是模型類。 (原諒我缺乏剃刀,但我更喜歡C#...)

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<TableMeters>>" %> 
    <table> 
    <% foreach(TableMeter meter in Model){ %> 
     <tr> 
      <td><%= meter.sno %></td> 
      <td>...</td> 
     </tr> 
    <% } %> 

然後,在主頁上,你會希望這些方針的東西:

<% using(Ajax.BeginForm("MeterInfo", "Power", new AjaxOptions() { UpdateTargetId = "meterTable" })){ %> 
    <%= Html.DropDownList("meter_id", new SelectList(Model, "sno", "meter_name"), "-- Select Meter --", new { id = "meters", onchange="$(this).parent().submit()" }) %> 
<% } %> 

<div id="meterTable"> 
    <%= Html.Partial("MeterTable", Model.TblMeters) %> 
</div> 

你的控制器的方法可以保持大致相同,但你需要刪除[HTTPGET]並更改回:

return PartialView("MeterTable", _meter); 

仔細檢查邏輯至於什麼是四處逛逛過去了,我不完全知道什麼所有的類的樣子,但應該做的伎倆。當你改變下拉菜單時,它會觸發「onchange」事件,該事件應該提交包含的表單。表單將通過AJAX提交給控制器。請注意,下拉列表的名稱必須與控制器方法的參數相匹配。你可以像你已經擁有它一樣進行過濾,並將列表返回到局部視圖。部分視圖將填充,並替換div的內容。