使用自定义ModelBinder在控制器操作中强类型化TPH模型 - 这是否有臭味?
这里有我的解决方案的一些背景:使用自定义ModelBinder在控制器操作中强类型化TPH模型 - 这是否有臭味?
- ASP.Net MVC应用程序
- 使用LINQ到SQL与表每层次结构的继承
- 使用DataAnnotationsModelBinder默认
所以我有一个Device
抽象类,然后是一系列派生类(ServerDevice
,DiskDevice
,PSUDevice
等),它们以被禁止的Linq-to-SQL方式继承它。我有一个控制器可以处理所有这些不同的相关模型类型,并根据类型呈现不同的部分,并使用方便的下拉选择它们。我(GET)创建方法是这样的:
// GET: /Devices/Create/3 public ActionResult Create(int? deviceTypeID)
{
return View(DeviceFactory(deviceTypeID);
}
凡DeviceFactory
是一个静态方法返回基于一个int鉴别的一个派生类的新实例。该POST Create方法看起来是这样的:
// POST: /Devices/Create [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([ModelBinder(typeof(DeviceModelBinder))]Device device)
{
if (!ModelState.IsValid)
return View(device);
_repository.Add(device);
_repository.Save();
TempData["message"] = string.Format("Device was created successfully.");
return RedirectToAction(Actions.Index);
}
和我的自定义模型粘合剂是这样的:
public class DeviceModelBinder : DataAnnotationsModelBinder {
private readonly Dictionary<string, Type> _deviceTypes =
new Dictionary<string, Type>
{
{"1", typeof (ServerDevice)},
{"2", typeof (DiskDevice)}
// And on and on for each derived type
};
protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext, Type modelType)
{
return base.CreateModel(controllerContext, bindingContext,
_deviceTypes[bindingContext.ValueProvider["deviceTypeID"].AttemptedValue]);
}
}
所以试图钩住这个一整天,阅读ActionInvoker,定制ActionFilters,和所有后其他MVC的东西,我想知道如果我已经到达的解决方案是一个很好的。帮助消除我担心我错过了一些非常明显的概念并重新发明了方向盘。 有没有更好或更简洁的方法?
谢谢!
回答:
我的POV将实体/域类型绑定到UI上是“臭”。我在this answer中详细解释了这一点。恕我直言,你应该几乎总是使用专用的演示模型。模型绑定做演示模型相当容易,但是在链接的答案中讨论了更重要的好处。
以上是 使用自定义ModelBinder在控制器操作中强类型化TPH模型 - 这是否有臭味? 的全部内容, 来源链接: utcz.com/qa/263782.html