我正在使用asp.net mvc4,我如何从ViewBag读取数据,我的ViewBag是一个通用列表,我想从javascript访问数据(viewbag)。
我正在将一个通用列表从控制器传递到视图,这个列表可以帮助我在这里加载一个下拉列表。 除了加载下拉列表,我需要访问一些通用列表数据,以便当下拉列表的值用列表中的数据更新文本框时
答案 0 :(得分:3)
从技术上讲,ViewBag是一个可以包含通用列表的字典。它仅在最初呈现页面时可用。因此,您无法直接从JavaScript访问它。但是你可以做的是从ViewBag中获取列表,在Razor中将其序列化为JSON并在JavaScript中反序列化。
public ActionResult Index(){
//make this whatever list you want
ViewBag.MyList = new ArrayList();
}
这会将ViewBag字典中的一个键设置为等于您选择的列表。现在,我们需要序列化它,以便我们可以在JavaScript中访问它。
var jsonList = '@Html.Raw(Json.Convert(ViewBag.MyList))'
var jsList = JSON.parse(jsonList);
要获得一个列表,更不用说在View of Newtonsoft.Json或你使用的任何序列化程序中创建依赖项,这是很多工作,如果内存服务,它也不是很有效。为什么不提出从API控制器获取所需数据的请求,该控制器将为您处理序列化,从而加快初始页面加载速度?
编辑: 我认为你要找的是this。您不需要使用JavaScript来实现您的要求。利用MVC的力量。
答案 1 :(得分:1)
将数据从ASP.NET代码传递到JS层的最简单方法之一是序列化对象,然后将序列化作为JS对象呈现到View中。这是一个例子:
// helper extension method
public static string ToJSON(this object o)
{
var oSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return oSerializer.Serialize(o);
}
在你的控制器内:
Viewbag.Foo = myObj.ToJSON();
然后,在View中,您只需将序列化的obj吐出为文字JavaScript:
var json = @Html.Raw(Viewbag.Foo); // mix of Razor and JS here!
当你运行它时,如果您查看源代码,您将在视图的该部分中看到类似的内容:
var json = {"prop1":true, "arrayItems":[{ "prop1": "dog" }, { "prop": "car" }]}
答案 2 :(得分:0)
<强>声明强>
这是一个极其直接,简单且不优雅的解决方案。但是,它的工作原理=)
考虑这个课程:
public class Something
{
public int Id { get; set; }
public string PropA { get; set; }
public string PropB { get; set; }
}
这段代码就行动了:
List<Something> list = new List<Something>() {
new Something(){ Id = 1, PropA = "1-A", PropB = "1-B "}
, new Something(){ Id = 2, PropA = "2-A", PropB = "2-B "}
};
ViewBag.Things = list;
最后,观点:
<select id="theSelect">
@foreach (Something item in ViewBag.Things)
{
<option value="@item.Id">@item.PropA</option>
}
</select>
<input type="text" id="selectedPropB" readonly />
<div style="display: none;">
@foreach (Something item in ViewBag.Things)
{
<span id="propb-@item.Id">@item.PropB</span>
}
</div>
<script type="text/javascript">
$(function () {
$('#theSelect').on('change', function () {
var id = $(this).val();
$('#selectedPropB').val($('#propb-'+id).html());
});
});
</script>
注意:
ViewBag
。无论如何,这取决于你答案 3 :(得分:0)
<script type="text/javascript">
var jsList= @Html.Raw(Json.Encode(@ViewBag.GenericList));
</script>