我正在與asp.net mvc4,我如何可以從ViewBag中讀取數據,我ViewBag是一個通用列表,我想從JavaScript訪問數據(viewbag) 。asp.net mvc閱讀ViewBag通過javascript的通用列表
我從控制器傳遞一個通用列表到視圖,這個列表幫助我加載一個下拉列表在這裏工作得很好。 除了加載下拉列表,我需要訪問一些通用列表數據,以便當更新列表中的數據從列表中更新文本框的值時
我正在與asp.net mvc4,我如何可以從ViewBag中讀取數據,我ViewBag是一個通用列表,我想從JavaScript訪問數據(viewbag) 。asp.net mvc閱讀ViewBag通過javascript的通用列表
我從控制器傳遞一個通用列表到視圖,這個列表幫助我加載一個下拉列表在這裏工作得很好。 除了加載下拉列表,我需要訪問一些通用列表數據,以便當更新列表中的數據從列表中更新文本框的值時
從技術上講,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);
這是一個大量的工作,只是得到一個名單,更何況,在信息查看Newtonsoft.Json或任何串行器使用,而且如果沒有記錯,這是不是很有效,使得依賴。爲什麼不請求從API控制器獲取所需的數據,以便爲您處理序列化操作,從而實現更快的初始頁面加載?
編輯: 我認爲你要找的是this。你不需要使用JavaScript來實現你所要求的。利用MVC的力量。
從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();
然後,你的視圖中,你只吐出系列化OBJ作爲文字的JavaScript:
var json = @Html.Raw(Viewbag.Foo); // mix of Razor and JS here!
當你運行它,如果您查看源代碼,您將在視圖的該部分中看到類似這樣的內容:
var json = {"prop1":true, "arrayItems":[{ "prop1": "dog" }, { "prop": "car" }]}
聲明
這是一個極其直截了當,簡單和不完美的解決方案。然而,它的工作原理=)
考慮這個類:
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="[email protected]">@item.PropB</span>
}
</div>
<script type="text/javascript">
$(function() {
$('#theSelect').on('change', function() {
var id = $(this).val();
$('#selectedPropB').val($('#propb-'+id).html());
});
});
</script>
注:
ViewBag
,因爲原因。無論如何,這取決於你<script type="text/javascript">
var jsList= @Html.Raw(Json.Encode(@ViewBag.GenericList));
</script>
喜Shyju,我試圖做的是當DropDownList的價值變化值泛型列表複製到一個文本框 – raranibar
顯示一些代碼,請 – Shyju
Shyju,這是我的代碼 var myList ='@ Html.Raw(ViewBag.Coberturas as List)'; alert(myList.cdo_descripcion); 來自警報的消息是'value undefiened' –
raranibar