у меня есть один базовый класс и два производных класса:Действие контроллера с произведенными классов
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. Итак, мой questio:
Каков правильный способ настройки действия контроллера, чтобы я мог передавать производный класс, или StudentModel или TeacherModel?
FYI, я попробовал обычное связующее (см. Ниже), однако, я не знаю, является ли это хорошим способом справиться с этим.
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 [Статья] (http://msdn.microsoft.com/en-us/magazine/hh781022.aspx) имеет некоторые подробности о создании пользовательских Абстрактные Модель Binder. –
@StephenMuecke - Это хорошая статья, однако я не хочу, чтобы входящий запрос мог выбрать любой тип, который он хочет создать, без какого-либо вмешательства в процесс ввода. Было бы лучше, если бы AbstractBinder мог указать, какие конкретные типы, которые ему было разрешено создавать, и даже лучше, позволить ему взаимодействовать с атрибутом метода действия для их определения. –
@StephenMuecke. Что еще более важно, вы можете включить в него какой-то механизм безопасности, не позволяя определенным пользователям или ролям создавать определенные типы, даже если они могут быть разрешены на этом контроллере. Поэтому концепция, в то время как интригующая, требует гораздо больше работы. –