2013-06-25 34 views
0

我正在與asp.net mvc4,我如何可以從ViewBag中讀取數據,我ViewBag是一個通用列表,我想從JavaScript訪問數據(viewbag) 。asp.net mvc閱讀ViewBag通過javascript的通用列表

我從控制器傳遞一個通用列表到視圖,這個列表幫助我加載一個下拉列表在這裏工作得很好。 除了加載下拉列表,我需要訪問一些通用列表數據,以便當更新列表中的數據從列表中更新文本框的值時

+0

喜Shyju,我試圖做的是當DropDownList的價值變化值泛型列表複製到一個文本框 – raranibar

+1

顯示一些代碼,請 – Shyju

+0

Shyju,這是我的代碼 var myList ='@ Html.Raw(ViewBag.Coberturas as List )'; alert(myList.cdo_descripcion); 來自警報的消息是'value undefiened' – raranibar

回答

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); 

這是一個大量的工作,只是得到一個名單,更何況,在信息查看Newtonsoft.Json或任何串行器使用,而且如果沒有記錯,這是不是很有效,使得依賴。爲什麼不請求從API控制器獲取所需的數據,以便爲您處理序列化操作,從而實現更快的初始頁面加載?

編輯: 我認爲你要找的是this。你不需要使用JavaScript來實現你所要求的。利用MVC的力量。

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(); 

然後,你的視圖中,你只吐出系列化OBJ作爲文字的JavaScript:

var json = @Html.Raw(Viewbag.Foo); // mix of Razor and JS here! 

當你運行它,如果您查看源代碼,您將在視圖的該部分中看到類似這樣的內容:

var json = {"prop1":true, "arrayItems":[{ "prop1": "dog" }, { "prop": "car" }]} 
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="[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,因爲原因。無論如何,這取決於你
  • 我相信你可以找到更好的解決方案,如果你與淘汰賽等工作。無論如何,正如我所說,這個作品
+0

Andre Calil,感謝您的回答我調查並處理他們的數據,但是我正在執行的項目的實施成本很高 – raranibar

+0

@raranibar I對不起,我不明白。你是否說這將很難實施? –

+0

Andre Calil,我用來加載dropdownlist函數,該函數返回數據庫中的數據,並根據您向我發送的腳本進行自定義,並在下拉列表發生更改時調用函數調用需要很長時間才能解決問題(控制器).ajax更新textobox,我很感謝你的關注,我會在其他項目中使用你的解決方案..非常感謝你 – raranibar

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