asp.net mvc通过javascript阅读ViewBag通用列表

时间:2013-06-25 19:31:48

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

我正在使用asp.net mvc4,我如何从ViewBag读取数据,我的ViewBag是一个通用列表,我想从javascript访问数据(viewbag)。

我正在将一个通用列表从控制器传递到视图,这个列表可以帮助我在这里加载一个下拉列表。 除了加载下拉列表,我需要访问一些通用列表数据,以便当下拉列表的值用列表中的数据更新文本框时

4 个答案:

答案 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>

注意:

  • 因为原因,我宁愿使用 viewmodel 而不是ViewBag。无论如何,这取决于你
  • 如果您使用淘汰赛等,我相信您可以找到更好的解决方案。无论如何,正如我所说,这是有效的

答案 3 :(得分:0)

<script type="text/javascript">
     var jsList= @Html.Raw(Json.Encode(@ViewBag.GenericList));
</script>