【问题标题】:Dynamically add choices to pulldown MVC Razor动态添加选项到下拉 MVC Razor
【发布时间】:2014-10-15 23:48:01
【问题描述】:

我在 HomeController 中有这段代码,应该返回最后 6 行。

private List<SelectListItem> GetOriginalIDs(string thisPWS)
{
    List<SelectListItem> list = new List<SelectListItem>();

    var cat = (from c in _db.DWS_BactiBucket.OrderByDescending(x => x.SampDate) 
               where  c.PWS == thisPWS && c.SampType  == "R" && c.IsTOTPresent  == "1" select c).Take(6).ToArray();

    for (int i = 0; i < cat.Length; i++)
    {
        list.Add(new SelectListItem { Text = cat[i].LabSampID + " (" + cat[i].SampDate + ")", Value = cat[i].LabSampID.ToString() });
    }

    return list
}

我想运行此代码以根据第一次下拉菜单中选择的内容填充第二次下拉菜单(我敢打赌您以前从未听说过这个)。

这是添加视图的第一个下拉菜单:

<div class="editor-field">
    @{
        var listItems = new List<SelectListItem>();
        listItems.Add(new SelectListItem{Text="", Value=""});                
        listItems.Add(new SelectListItem{Text="R", Value="R"});
        listItems.Add(new SelectListItem{Text="P", Value="P"});                
        listItems.Add(new SelectListItem{Text="C", Value="C"});
        listItems.Add(new SelectListItem{Text="T", Value="T"});
        listItems.Add(new SelectListItem{Text="A", Value="A"});   
        listItems.Add(new SelectListItem{Text="S", Value="S"});                

        }

    @Html.DropDownListFor(m=>m.SampType, listItems)

</div>

这一切都显示得很好。 这是第二个下拉菜单:

        <div class="editor-field">

            @Html.DropDownListFor(model => model.OrigSampID(IEnumerable<SelectListItem>)ViewBag.Originals)
   })

         </div>

目标是使用 JSON 和/或 jQuery 填充第二个,但我无法理解调用控制器和填充第二个下拉列表的代码语法。所有的例子都没有帮助我。

【问题讨论】:

  • 填充第二个的逻辑是什么?它是否基于第一个的选定值。谷歌MVC cascading select。有很多例子说明如何做到这一点
  • 好的,我去了你的谷歌搜索,前 8 个链接都处理相同类型的概念证明州/城市级联下拉。看起来第九个可能会让我更接近我想要的。但我在等着看 bigfetz 对我当前代码的看法。
  • 不确定我是否理解您的问题。第一个下拉菜单的值为“R”或“P”或“C”等。这是您要回发到GetOriginalIDs 的内容吗?因此,如果您选择“R”,那么查询将是 from c in _db.DWS_BactiBucket.OrderByDescending(x =&gt; x.SampDate) where c.PWS == "R" &amp;&amp; c.SampType == "R" &amp;&amp; c.IsTOTPresent == "1" select c ....?至于返回 JSON,您应该创建一个匿名对象列表,其中包含您想要的第二个下拉列表的值和文本(不是 SelectList
  • 如果值为“P”,则填充第二个下拉列表。 (P 的意思是“重复样本”,它必须引用一个 R(例程阳性)。所以我推迟确定第一个被选中的值。我假设“P”,以便我可以先让困难的部分工作。好吧,我正在尝试“JsonResult”并将行放在列表中并将其作为结果返回。但现在我收到此错误。异常详细信息:System.ArgumentNullException:值不能为空。参数名称:项目这是由我要填充的 SelectItemList。
  • 我看到您发布了另一个相关问题。我会在那里回复。

标签: jquery asp.net-mvc json asp.net-mvc-4 razor


【解决方案1】:

所以如果我们有这个 html:

<select id="drop1">
  <option value="R">R</option>
  <option value="P">P</option>
  <option value="C">C</option>
  <option value="T">T</option>
</select>
<select id="drop2">
</select>

你可以使用这个 jquery 来监听选择选项的动作

$('#drop1').change(function(){
   $.get('GetData', {value : $(this.val())}, function(json){
      var html = ''
      $(json).each(function() {
         html += '<option value="' + $(this).value  +'">' + $(this).text + ' '</option>'
      })
      $('#drop2').empty().append(html) //empty first then append to remove previous elements
   })
});

你可以在你的控制器中有一个方法调用 GetData 像这样

[HttpGet]
public ActionResult GetData(char val)
{
  //turn elements into json result
  return Json( elements);
}

注意:您可以从后端返回一个已经构建了 html 的部分,然后将其附加到下拉列表中,但我发现在 JS 中创建选项而不是在后面创建更简单结尾。

【讨论】:

  • 嘿 bigfetz 它看起来很接近我在想。但是,当我访问您的控制器代码时,我会迷路,因为如果您查看我当前在我的第一个代码块中拥有的内容(它从数据库查询构建一个列表,当前使用的是硬编码的 99999)。我不确定如何在最后一个代码块中执行“return Json(elements”) 部分。水样检测需要重复样本,并且重复必须引用原始正样本的 ID。第二次下拉返回最后 6 个正样本输入的水系统 ID,使用它的 ID。
  • 好吧,我的想法是您在 GetData 操作的参数中使用 val(val 将是 ID),然后使用 val 进行查询以从数据库中获取要填充下拉列表的元素列出。可以做到这一点的一种方法是使用从查询中获得的数据创建一个 SelectListItem 数组。然后将其放入 Json() 并返回它(是的,就这么简单)。然后,json 将可用于前端 jquery 以创建填充下拉列表的 html。
  • 还要注意,在尝试获取 Json 时,您可能会遇到此异常:“此请求已被阻止,因为在 GET 中使用敏感信息时可能会将其泄露给第三方网站请求。要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet。”只需像这样添加 JsonRequestBehavior.AllowGet : Json(data, JsonRequestBehavior.AllowGet) 即可修复错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多