2012-08-13 71 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的内容。