我正在尝试将.NET对象转换为JSON字符串,因为我希望能够在客户端读取此对象的内容。
这是我的控制器代码:
public ActionResult Index()
{
IRightsManager rightsInfo = new RightsManager();
string userId = "ynz362897";
string json = JsonConvert.SerializeObject(rightsInfo.GetSectorsForUser(userId));
Session["test"] = json;
return View();
}
GetSectorsForUser返回一个只有一个属性的对象,另一个对象的列表。这是模型:
public class Sector
{
public string Code { get; set; }
public string Name { get; set; }
public Sector(string code, string name)
{
this.Code = code;
this.Name = name;
}
}
public class RightsList
{
public IList<Sector> Sectors;
public RightsList(IList<Sector> sectors)
{
this.Sectors = sectors;
}
}
这是GetSectorsForUser代码:
public RightsList GetSectorsForUser(string userId)
{
IRightsManagerDB rightsManager = new RightsManagerDB();
RightsList rightsList = new RightsList(rightsManager.GetSectorsForUser(userId));
return(rightsList);
}
我的代码目前产生的结果是:
"{\"Sectors\":[{\"Code\":\"01\",\"Name\":\"FME\"},{\"Code\":\"02\",\"Name\":\"DML\"}]}"
jQuery客户端中的for是不可读的。我被困在这几个小时,我找不到任何解决方案。
以下是客户端代码:
var sectors = @Session["Sectors"];
$.each(sectors, function (i, item) {
$('#comboSector').append($('<option>', {
text: item.Name,
value : item.Code
}));
});
答案 0 :(得分:0)
ASP.NET MVC为您处理JSON序列化。这意味着您不需要:
string json = JsonConvert.SerializeObject(rightsInfo.GetSectorsForUser(userId));
线。发生的事情是您自己序列化对象,然后ASP.NET MVC再次序列化它,导致实际结果,即序列化为JSON的字符串。换句话说:
{"Sectors": ...
,"{\"Sectors\": ...
。看起来这就是你实际在做的事情,并且:
var sectors = @Session["Sectors"];
是Razor文件。这是一种非常奇怪的方法(混合语言,动态生成JavaScript,从视图中访问会话¹),但是,让我们假设您知道自己在做什么。
这里发生的是sectors
变量指向包含JSON序列化对象的字符串,而不是对象本身。如果您需要获取对象,请执行以下操作:
var sectorsObj = JSON.parse(sectors);
$.each(sectorsObj, ...
JSON.parse
解码JSON序列化对象。同样,JSON.stringify
将对象转换为其JSON表示。
¹像你一样从你的视图中访问会话不仅是滥用MVC模型和重构 - 不友好,而且technically wrong。将视图限制为模型的内容,并最终限制视图包。避免使用全局变量,会话,请求/响应对象等
答案 1 :(得分:0)
@MainMa感谢您的回答。就像你说的那样,对我来说技术上并不是很清楚。我根据标准进行了一些研究并清理了我的代码。现在我对Ajax有了更好的理解,这就是我解决问题的方法。
这是我的ajax请求客户端。
$sql_select = "SELECT * FROM images WHERE ID = $SomehowGetID";
$sql_table_selected = mysql_query($sql_select);
$table_row = mysql_fetch_array($sql_table_selected);
echo "<div class=\"galery-big\"><figure>";
echo "<img src=\"" . $table_row['file_path'] . "\" />";
echo "<figcaption>" . $table_row['tytul'] . "</figcaption></figure></div>";
我的控制器服务器端回答:
$(document).ready(function () {
$.ajax({
url: '/Home/GetSectors',
type: 'GET',
dataType: 'json',
success: function (json) {
$.each(json, function (idx, sector) {
$('#comboSector').append($('<option>', {
text: sector.Name,
value: sector.Code
}));
})
},
error: function () {
}
});
})
现在我的组合使用服务器发送的参数进行初始化。不再使用Session。