【问题标题】:Adding an item to a dropdownlist which is in another partial view without refreshing the view将项目添加到另一个部分视图中的下拉列表而不刷新视图
【发布时间】:2016-11-02 04:55:18
【问题描述】:

我是 asp.net mvc 的新手,我现在正面临下拉列表的这个问题。 对不起,如果我问了一个愚蠢的问题。

我有一个主视图 AbcView,它绑定到控制器 AbcController,控制器将 AbcModel 传递给视图。

我在这个 AbcView 中有 2 个部分视图,它们在按钮点击时加载。

在第二个局部视图中,我有这段代码:

@Html.DropDownListFor(model => Model.TrajectoryName, new SelectList(@Model.Trajectories, "Value", "Text"),
                        new { @class = "dropdown-leftandright", id = drpTrajectory" })

在第一个部分视图中,我有一些数据正在添加到数据库中,点击一些按钮,如下所示:

function deleteAction(trajID) {
$.ajax({
    type: "POST",
    url: "/AbcView/DeleteAction",
    data: JSON.stringify({ deleteTraj: trajID }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: false,
    success: function (data) {
        // I want to update the drpTrajectory dropdownlist here
    },
    error: function (e) {
        return "error";
    }
});        
}                       

我的问题是我想在此函数内的第二个局部视图中访问 drpTrajectory。我想在这个特定的下拉列表中添加一些项目。 我尝试使用$('#drpTrajectory') 访问下拉列表并尝试添加一个项目。但它失败了。

我尝试添加这样的数据

$('#drpTrajectory ').add(val(data.x).text(data.y));

data 将成为 IEnumerable<SomeClass> dataListSomeClass 的成员,其中包含 idname,它们可以分别是值和文本。

我已经在单击按钮期间更新模型数据,即 @Model.Trajectories 正在更新。

所以请帮助我将一个项目添加到此下拉列表中,该项目位于我的第一个部分视图的第二个部分视图中,而无需刷新整个视图。 有什么想法吗?

【问题讨论】:

  • 显示您尝试添加它的方式。 data 包含什么? (添加一个选项$('#drpTrajectory').append($('<option></option>').val(data.x).text(data.y));
  • <option></option> 是什么意思?我理解了价值和文字部分。我试过这样的$('#drpTrajectory ').add(val(data.x).text(data.y));。 @StephenMuecke
  • 您应该在问题中表明这一点以便给出答案,并指出data 是什么以及您使用它的哪些属性来添加新选项
  • 我已编辑。请立即查看@StephenMuecke
  • 给我 15 分钟,我会添加一个答案(您的代码中还有其他一些可以改进的地方) - 但您已经注意到 data 是一个序列化的 IEnumerable<SomeClass> - 您想向下拉列表中添加多个选项吗?

标签: javascript c# asp.net-mvc html asp.net-mvc-4


【解决方案1】:

假设您的方法返回一个对象集合,然后创建一个选项并将其附加到您需要的<select>

var select = $('#drpTrajectory') // cache it
$.ajax({
    type: "POST",
    url: '@Url.Action("DeleteAction", "AbcView")',
    data: { deleteTraj: trajID },
    dataType: "json",
    success: function (data) {
        select.empty() // if you need to remove the existing options
        $.each(data, function (index, item) {
            // Create an option element
            var option = $('<option></option>').val(item.id).text(item.name);
            // append it to the select element
            select.append(option);
        })
    },
    ....
});

附注

  1. 始终使用@Url.Action() 以确保您的网址正确无误 生成
  2. 不需要stringify() the data and then add the contentType`选项
  3. 您的控制器方法应该返回一个匿名集合 仅包含您需要的 2 个属性的对象(没有意义 发回未使用的额外数据)

    var data = dataList.Select(x => new { id = x.id, name = x.name });
    return Json(data)
    
  4. 您对new SelectList(@Model.Trajectories, "Value", "Text")的使用 表明属性Trajectories 已经 IEnumerable&lt;SelectListItem&gt;。如果是这样的话,就没有 点从原始创建一个相同的SelectList,所以 只需使用

    @Html.DropDownListFor(model => Model.TrajectoryName, Model.Trajectories, new { @class = "dropdown-leftandright", id = drpTrajectory" })
    
  5. DropDownListFor() 方法已经在创建 id="TrajectoryName" 所以没有真正需要覆盖它 使用new { id = drpTrajectory" }

【讨论】:

  • 查看您的代码,我猜您真正想要做的就是从&lt;select&gt; 中删除一个选项 - 如果是这种情况,则不需要从创建一个新的选项列表 - 您可以从现有的 &lt;select&gt; 中删除一个选项
  • 非常感谢。谢谢你的时间。这么多信息。因为我是初学者,所以对我有帮助。关于第 4 点的疑问:如果我们绑定到 IEnumerable 那么就不需要像这样指定值和文本,对吧? new SelectList(@Model.Trajectories, "Value", "Text")
  • 没有。如果您的模型属性是public IEnumerable&lt;SelectListItem&gt; Trajectories { get; set; },那么只需将Model.Trajectories 用于DropDownListFor() 的第二个参数——所有代码所做的只是创建另一个相同的IEnumerable&lt;SelectListItem&gt;——这只是不必要的额外开销
  • 我还建议您停止使用行为污染您的标记并使用Unobtrusive JavaScript(我假设您目前必须有类似&lt;button onclick="deleteAction(this.id)" ...&gt;的东西
  • 你显然仍然需要传递ID,但更好的做法是使用(比如)&lt;button type="button" class="delete" data-trajID="@item.TrajectoryID"&gt;Delete&lt;/button&gt;,然后脚本变为$('.delete').click(function() { var id = $(this).data('trajID'); .....
【解决方案2】:

这是您的解决方案:

 success: function (data) {
    // I want to update the drpTrajectory dropdownlist here
    $.each(data, function (i, item) {
        $('#drpTrajectory').append($('<option>', { 
             value: item.id,
             text : item.name 
        }));
    });
 }

【讨论】:

  • 感谢您的宝贵时间。根据斯蒂芬的评论,我已经找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多