无法将所选选项提交给控制器
本文关键字:提交 控制器 选项 | 更新日期: 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>
}
}