首页 > 解决方案 > 输入将正确的选择值返回给控制器,但选择列表不是

问题描述

我的剃刀视图上有条件输入或选择列表。当我将操作直接放在我的表单上时,它可以正常工作;但是当我尝试获取表单值并将其发送到我的控制器时,它不会在选择列表上传递选定的值。

在我的模型中

public MyItemModel()
            {
                AllowedQuantities = new List<SelectListItem>();
            }
public int Quantity { get; set; }
            public List<SelectListItem> AllowedQuantities { get; set; }

            public int EnteredQuantity { get; set; }

在我看来

<td class="contribute">
    <form id="add-to-cart-registry-form">
        @if (item.AllowedQuantities.Count > 0)
            {
              <select asp-for="@item.EnteredQuantity" asp-items="@item.AllowedQuantities" name="enteredquantity" class="qty-dropdown" id="qty-drp"></select>
             }
             else
             {
             <input name="enteredquantity" type="text" class="update-textbox gr-item-update-split" value="@item.EnteredQuantity" />
              }
       <input type="submit" value="Add to Cart" class="update-button gr-item-update-split gr-item-update-split-button" onclick="addProductCartFmRegistry('@Url.Action("AddItemsToCartFromRegistry", new { registryItemId = item.Id, shoppingCartTypeId = (int)ShoppingCartType.ShoppingCart })', '#add-to-cart-registry-form')" />
    </form>
</td>
<script>
                function addProductCartFmRegistry(addToCartFmRegistryUrl, formselector) {
                    var atcUrl = addToCartFmRegistryUrl;
                    var formdata = $(formselector).serialize();
                    if (AjaxCart.loadWaiting != false) {
                        return;
                    }
                    AjaxCart.setLoadWaiting(true);

                    $.ajax({
                        cache: false,
                        url: atcUrl,
                        data: formdata,
                        type: 'post',
                        success: AjaxCart.success_process,
                        complete: AjaxCart.resetLoadWaiting,
                        error: AjaxCart.ajaxFailure
                    });
                }
            </script>

和我的控制器

[HttpPost]
public virtual IActionResult AddItemsToCartFromRegistry(int registryItemId, int shoppingCartTypeId, IFormCollection form)
{
}

当我准备我的模型时,我将默认输入数量设置为 1。

如果它来自输入,则将正确的输入值传递给控制器​​;但如果它是选择列表,它会传递 1 而不是选定的选项。

如果我以我的形式使用动作,它完全可以正常工作:

<td class="contribute">
    <form action="@Url.Action("AddItemsToCartFromRegistry", new { registryItemId = item.Id, shoppingCartTypeId = (int)ShoppingCartType.ShoppingCart })" method="post">
          @if (item.AllowedQuantities.Count > 0)
              {
              <select asp-for="@item.EnteredQuantity" asp-items="@item.AllowedQuantities" name="enteredquantity" class="qty-dropdown" id="enteredqty-@item.Id"></select>
              }
              else
              {
               <input name="enteredquantity" type="text" value="@item.EnteredQuantity" class="update-textbox gr-item-update-split" id="enteredqty-@item.Id" />
              }
           <input type="submit" value="Add To Cart" class="update-button gr-item-update-split gr-item-update-split-button" onclick="addProductCartFmRegistry(@item.Id)" />
     </form>
</td>

但我想通过 ajax 调用来将 json 警告返回到我的页面。

任何想法 ajax 调用版本缺少什么?以及如何将正确的选定列表项值发送到我的控制器?

标签: c#razormodel-view-controllerformcollectionselectlistitem

解决方案


我没有提到我的问题,但我的 td 处于循环状态。

<td class="contribute">
    <form id="add-to-cart-registry-form-@item.Id">
        @if (item.AllowedQuantities.Count > 0)
            {
              <select asp-for="@item.EnteredQuantity" asp-items="@item.AllowedQuantities" name="enteredquantity" class="qty-dropdown" id="qty-drp"></select>
             }
             else
             {
             <input name="enteredquantity" type="text" class="update-textbox gr-item-update-split" value="@item.EnteredQuantity" />
              }
       <input type="submit" value="Add to Cart" class="update-button gr-item-update-split gr-item-update-split-button" onclick="addProductCartFmRegistry('@Url.Action("AddItemsToCartFromRegistry", new { registryItemId = item.Id, shoppingCartTypeId = (int)ShoppingCartType.ShoppingCart })', '#add-to-cart-registry-form-@item.Id')" />
    </form>
</td>

刚刚在表单名称上添加了@item.Id,onclick 功能工作正常。


推荐阅读