使用自定义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

回到顶部