【问题标题】:Cannot submit selected option to contoller无法将所选选项提交给控制器
【发布时间】:2016-02-25 21:43:13
【问题描述】:

我的购物车视图模型是

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 为零?

选择未在控制器上传递。我在这里做错了什么?

【问题讨论】:

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


【解决方案1】:

单选按钮的名称生成问题,因此 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>
      }
}

【讨论】:

  • 这甚至无法编译
  • 只是测试它,你有它的一切
  • 不确定,为什么它被否决了?这不是问题的答案吗?
【解决方案2】:

您尝试将单选按钮组绑定到复杂对象的集合。单选按钮仅发布所选按钮的值(在您的情况下为所选 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 =&gt; p.IsActive);

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 2016-11-20
    • 2018-01-16
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多