【问题标题】:asp.net mvc reading ViewBag generic list via javascriptasp.net mvc 通过 javascript 读取 ViewBag 通用列表
【发布时间】:2013-06-25 19:31:48
【问题描述】:

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

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

【问题讨论】:

  • 嗨 Shyju,我正在尝试将 DropDownList 值更改值通用列表复制到文本框时
  • 请显示一些代码
  • Shyju,这是我的代码 var myList = '@Html.Raw(ViewBag.Coberturas as List)';警报(myList.cdo_descripcion);来自警报的消息是“价值未定义”
  • @raranibar 您能否就我的回答提供任何反馈?我想这就是你要找的。如果不是这样,留下我会发表评论,我会努力的

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


【解决方案1】:

从技术上讲,您的 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 中为 Newtonsoft.Json 或您使用的任何序列化程序创建依赖关系,而且如果内存服务,它不是很有效。为什么不请求从 API 控制器获取您需要的数据,该控制器将为您处理序列化,从而加快初始页面加载速度?

编辑: 我想你要找的是this。您不需要使用 JavaScript 来实现您的要求。利用 MVC 的力量。

【讨论】:

    【解决方案2】:

    将数据从 ASP.NET 代码来回传递到 JS 层的最简单方法之一是序列化对象,然后将序列化作为 JS 对象呈现到视图中。这是一个例子:

    // 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" }]}
    

    【讨论】:

      【解决方案3】:

      免责声明

      这是一个非常直接、简单且不优雅的解决方案。但是,它有效 =)

      考虑这个类:

      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,因为原因。无论如何,这取决于你
      • 我相信如果您使用淘汰赛等,您会找到更好的解决方案。无论如何,正如我所说,这行得通

      【讨论】:

      • Andre Calil,感谢您的回答我调查并使用他们的数据,但我正在做的项目的实施成本很高
      • @raranibar 对不起,我不明白。你是说实施起来很难?
      • Andre Calil,我使用加载下拉列表的函数,该函数从数据库返回数据并根据您发送给我的脚本进行自定义,并且在发生更改时需要很长时间才能解决我的问题在下拉列表中调用函数(控制器).ajax 来更新文本框,感谢您的关注,我将在其他项目中使用您的解决方案.. 非常感谢
      • @raranibar 好的,很高兴为您提供帮助
      【解决方案4】:
      <script type="text/javascript">
           var jsList= @Html.Raw(Json.Encode(@ViewBag.GenericList));
      </script>
      

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多