无法将所选选项提交给控制器

本文关键字:提交 控制器 选项 | 更新日期: 2023-09-27 18:23:56

我的购物车视图模型是

public class CartViewModel
{
    public List<PaymentMethods> PaymentMethod { get; set; }
}

我的PaymentMethods类

public partial class PaymentMethods
{
    public int PaymentMethodID { get; set; }
    public string PaymentName { get; set; }
    public bool Active { get; set; }
}

我的观点是

@foreach (PaymentMethods pm in Model.PaymentMethod)
  {
      if (pm.Active)
      {
          <li>
              @Html.RadioButtonFor(c => c.PaymentMethod, pm.PaymentMethodID, new { id = "pay" + pm.PaymentMethodID, @class = "paymethod" })
              <label for="@("pay" + pm.PaymentMethodID)" class="checkbox">@pm.PaymentName</label>
          </li>
      }
   }

控制器接受CartViewModel作为参数。

[HttpPost]
public ActionResult Index(CartViewModel CartViewModel)
{
}

问题是,为什么当我选择付款方式并提交表格时,控制器的PaymentMethod.Count等于零?

该选择不会传递到控制器上。我在这里做错了什么?

无法将所选选项提交给控制器

您试图将单选按钮组绑定到复杂对象的集合。单选按钮仅发布所选按钮的值(在您的情况下是所选PaymentMethodID属性的值)。您的模型中需要一个单独的属性才能绑定到。

public class CartViewModel
{
    public int SelectedPaymentMethod { get; set; }
    public IEnumerable<PaymentMethods> PaymentMethods { get; set; }
}

并将您的视图修改为

@foreach (PaymentMethods pm in Model.PaymentMethod)
{
    <li>
        <label>
            @Html.RadioButtonFor(c => c.SelectedPaymentMethod, pm.PaymentMethodID, new { id = "", @class = "paymethod" })
            <span>@pm.PaymentName</span>
        </label>
    </li>
}

现在,当您提交表单时,SelectedPaymentMethod的值将是所选PaymentMethodID属性的值。

附带说明:与其在视图中包含if (pm.Active)语句,不如考虑在控制器(例如model.PaymentMethods = db.PaymentMethods.Where(p => p.IsActive);)中过滤集合

单选按钮的名称生成问题,因此服务器上不会发生ModelBinding。此外,您还应该为所选项目绑定一个项目。

将模型属性添加为

public int SelectedPayMethodID { get; set;}

更改实现方式如下

@for (int index =0; index < Model.PaymentMethod; index++)
  {
      if (Model.PaymentMethod[index].Active)
      {
          <li>
              @Html.RadioButtonFor(model => model.SelectedPayMethodID, Model.PaymentMethod[index].PaymentMethodID, new { id = "pay" + Model.PaymentMethod[index].PaymentMethodID, @class = "paymethod" })
              <label for="@("pay" + Model.PaymentMethod[index].PaymentMethodID)" class="checkbox">@pm.PaymentName</label>
          </li>
      }
}