【问题标题】:MVC update ListboxFor with selected values from DropDownListForMVC 使用从 DropDownListFor 中选择的值更新 ListboxFor
【发布时间】:2016-04-16 16:27:39
【问题描述】:

我目前在 MVC 中的网站上工作,我创建了一个带有 DropDownListFor 的局部视图,每次在 DropDownListFor 中选择一个值时,它都会转到 HttpPost 并将值添加到列表中。我还有一个绑定到这个列表的 ListBoxFor。

我想要达到的目标:

每次使用 DropDownListFor 将新值添加到 List 时,它应该自动更新 ListBoxFor,以便将所选值添加到此 Listbox。我想知道实现这一目标的最佳方法是什么。

代码:

提交.cshtml:

<div class="create-ingredient">
     @Html.Partial("_CreateIngredient")
</div>
<br/>
<div class="add-ingredient">
     @Html.Partial("_AddIngredient")
</div>
<br/>
<div class="ingredient-listbox">
     @Html.LabelFor(model => model.Ingredients,"Current Ingredients")
     @Html.ListBoxFor(model => model.Ingredients, new MultiSelectList(Model.SelectedIngredients), new { style = "width:50%;" })
</div>

_AddIngredient.cshtml(部分视图):

@model Recepten.Models.IngredientSelectModel

@using (Ajax.BeginForm("AddIngredient", "Recipe", new AjaxOptions() { UpdateTargetId = "add-ingredient", HttpMethod = "Post" }))
{
    @Html.LabelFor(model => model.Ingredients, "Add Ingredient")
    @Html.DropDownListFor(model => model.SelectedIngredient, Model.Ingredients, "Select Ingredient", new { @onchange = "$(this).parents('form').submit();" })
}

添加成分:

[HttpPost]
public ActionResult AddIngredient(IngredientSelectModel ing)
{
    ing.SelectedIngredients.Add(ing.SelectedIngredient);
    return PartialView(ing);
}

成分选择模型:

public RecipeModel Recipe { get; set; }
public IEnumerable<SelectListItem> Ingredients { get; set; }
public int SelectedIngredient { get; set; }

public string addIngredient { get; set; }

public List<int> SelectedIngredients { get; set; }

public IngredientSelectModel()
{
    SelectedIngredients = new List<int>();
}

感谢您的宝贵时间!

【问题讨论】:

  • 我能问一下 JavaScript 和这个有什么关系吗?
  • 我对 javascript 不是很熟悉,但我认为如果 dropdownlistfor 中有 onclick 事件来更新 listboxfor,则可以创建一个事件,因为我不确定我已经删除了标签
  • 您需要 javascript 来处理下拉列表的更改事件,克隆所选选项并将其附加到列表框。但这不一定会提交回Ingredients 的值,除非在提交之前选择了每个选项。很难理解你想用这个实现什么。如果您想为食谱选择多种成分,那么这不是这样做的方法。您应该使用关联的复选框显示所有成分。
  • 当您点击下拉列表中的一项时,它应该将其添加到列表和列表框并且可以重复,尝试将 onchange 事件添加到列表框,但没有成功

标签: asp.net ajax asp.net-mvc


【解决方案1】:

我认为您已经想到,当前方法不起作用的原因是为 AddIngredient 操作创建和更新的 IngredientSelectModel 与用于填充 ListBox 的操作是分开的。

如果正确设置了 Ajax 和不显眼的 JQuery(选择成分时浏览器 URL 不应更改),@pinhead 的答案会将所选值发送到操作,但 SelectedIngredients 不会累积您的值选择,因为它的值不包含在 ajax 数据中。为此,您需要将多选更改为绑定到SelectedIngredients

@Html.ListBoxFor(
    model => model.SelectedIngredients,
    new MultiSelectList(Model.SelectedIngredients),
    new { style = "width:50%;" })

...并将其移动到表单声明中,以便将其值与要添加的新成分一起发布到操作中。

也就是说,我不会说您所做的工作足以证明往返服务器的合理性,因此在进行上述更改后,您可以像这样在客户端完全添加成分:

@Html.DropDownListFor(
    model => model.SelectedIngredient, 
    Model.Ingredients, 
    "Select Ingredient", 
    new { @onchange = "$('#SelectedIngredients').append('<option>' + $(this).val() + '</option>')" })

【讨论】:

    【解决方案2】:

    我相信一种解决方案是将您的 ListBoxFor 助手移动到您的局部视图中,以便在您的操作返回局部视图时更新和重新创建它。

    提交.cshtml:

    <div class="create-ingredient">
         @Html.Partial("_CreateIngredient")
    </div>
    <br/>
    <div class="add-ingredient">
         @Html.Partial("_AddIngredient")
    </div> 
    

    _AddIngredient.cshtml(部分视图):

    @model Recepten.Models.IngredientSelectModel
    
    @using (Ajax.BeginForm("AddIngredient", "Recipe", new AjaxOptions() { UpdateTargetId = "add-ingredient", HttpMethod = "Post" }))
    {
        @Html.LabelFor(model => model.Ingredients, "Add Ingredient")
        @Html.DropDownListFor(model => model.SelectedIngredient, Model.Ingredients, "Select Ingredient", new { @onchange = "$(this).parents('form').submit();" })
    }
    @Html.LabelFor(model => model.Ingredients,"Current Ingredients")
    @Html.ListBoxFor(model => model.Ingredients, new MultiSelectList(Model.SelectedIngredients), new { style = "width:50%;" })
    

    【讨论】:

    • 我已经尝试过了,但不幸的是它没有工作
    • 您的代码中的一个错误似乎是您的 UpdateTargetId 设置为一个类,而不是一个 id。此外,如果您尚未安装它,则需要 Microsoft.jQuery.Unobtrusive.Ajax 包。
    • 谢谢,我将类更改为 id="add-ingredient",没有变化我还安装了包不显眼的 ajax,在检查元素时它被列出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多