【发布时间】:2014-07-16 09:48:30
【问题描述】:
我正在使用 C# ASP.Net MVC 4 和 MVC 5。
我使用了一个聚合模型VmVehicleGroup,它看起来有点像:
public class VmVehicleGroup {
public VehicleTypeEnum Type { get; set; }
public List<VmVehicle> Vehicles { get; set; }
public VmVehicle Editable { get; set;}
}
主视图对每个组都有部分视图,例如,
@Html.Partial(x => x.Cars, "_VehicleEditor")
@Html.Partial(x => x.Bus, "_VehicleEditor")
@Html.Partial(x => x.Truck, "_VehicleEditor")
每组部分显示Model.Vehicles,并为Model.Editable提供一个编辑器模板
我的问题来自 ModelState。每个部分将为 Model.Editable 呈现相同的输入字段名称/ID。当存在 ModelState 验证错误时,“Car”部分的验证错误将出现在所有其他表单上,而不仅仅是 Car。我通过在编辑器中为模型添加前缀来解决这个问题,例如:
ViewData.TemplateInfo.HtmlFieldPrefix = Model.Type.ToString(); // VehicleTypeEnum
添加/编辑表单现在将提交带有字段发布数据前缀的Model.Editable,即:Car.Reg、Car.Name、Car.Type 和 Car.Id。我的问题出现在 MVC 操作上。我目前的操作如下所示:
[ValidateAntiForgeryToken]
[AcceptVerbs(HttpVerbs.Post)]
[Route("Edit", Name = "EditVehicle")]
public ActionResult Edit([Bind(Prefix = "Car")] VmVehicle car, [Bind(Prefix = "Bus")] VmVehicle bus, [Bind(Prefix = "Truck")] VmVehicle truck, ....)
{
var model = car ?? bus ?? truck;
...
}
我的问题是,这是维护的噩梦 - 对于每个 VehicleTypeEnum,我需要添加额外的绑定参数。我不能对带前缀的模型执行单一操作。
我尝试过使用public ActionResult Edit(VmVehicle model) {},但前缀阻碍了 MVC 绑定。不幸的是,MVC 似乎也不允许您绑定通配符或逗号分隔的前缀,即:*.Car 或 Car,Bus,Truck。
是否可以鼓励 MVC 操作接受任何前缀,同时保留 ModelState 验证错误的前缀?
【问题讨论】:
标签: c# asp.net-mvc model-view-controller