【发布时间】:2015-03-09 18:19:55
【问题描述】:
我有一个基类和两个派生类:
public class UserModel {
public int Id {get; set; }
public string Name {get; set; }
public UserType UserType {get; set;}
}
public class StudentModel : UserModel {
public string StudentProperty {get; set;}
}
public class TeacherModel : UserModel {
public string TeacherProperty {get; set;}
}
在我的控制器 ProfileController.cs 中,我有以下两个操作:
public virtual ActionResult Detail(int id)
{
var userModel = _userService.Get(id);
return view(usermodel);
}
public virtual ActionResult Save(UserModel userModel)
{
_userService.Save(userModel);
}
我有一个视图来显示学生和教师的个人资料。我的问题如下:
保存时,使用动作Save(UserModel userMode),StudentModel和TeacherModel的附加属性(分别是StudentProperty和TeacherProperty)显然没有绑定到UserModel。所以我的问题是:
设置 Controller Action 以便我可以传递派生类(StudentModel 或 TeacherModel)的正确方法是什么?
仅供参考,我尝试了自定义活页夹(见下文),但是,我不知道这是否是处理此问题的好方法。
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var form = controllerContext.HttpContext.Request.Form;
switch (form["UserType"])
{
case "student":
{
var studentModel = bindingContext.Model as StudentModel;
return studentModel;
}
case "Teacher":
{
var teacherModel = bindingContext.Model as TeacherModel;
medico.TeacherProperty = form["TeacherProperty"];
return teacherModel;
}
}
return bindingContext.Model;
}
【问题讨论】:
-
FYI This article 有一些关于创建自定义抽象模型绑定器的详细信息。
-
@StephenMuecke - 这是一篇好文章,但是我不愿意允许传入的请求选择它想要实例化的任何类型,而无需进行某种输入清理。如果 AbstractBinder 可以指定允许创建哪些特定类型会更好,甚至更好的是,允许它与 action 方法上的属性交互以定义这些。
-
@StephenMuecke - 更重要的是,您可能还希望包含某种安全机制,不允许某些用户或角色实例化某些类型,即使它们可能在该控制器上被允许。所以这个概念虽然很有趣,但需要更多的工作。
标签: c# asp.net-mvc polymorphism derived-class