В моем приложении ASP.NET MVC у меня есть интерфейс, который служит шаблоном для нескольких различных моделей представлений:
public interface IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
Validator Validate();
}
Итак, мои модели представлений определены следующим образом:
public interface MyViewModel1 : IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
// Properties specific to MyViewModel1 here
public Validator Validate()
{
// Do ViewModel-specific validation here
}
}
public interface MyViewModel2 : IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
// Properties specific to MyViewModel2 here
public Validator Validate()
{
// Do ViewModel-specific validation here
}
}
Тогда у меня есть отдельное действие контроллера для проверки каждого отдельного типа с использованием привязки модели:
[HttpPost]
public ActionResult MyViewModel1Validator(MyViewModel1 model)
{
var validator = model.Validate();
var output = from Error e in validator.Errors
select new { Field = e.FieldName, Message = e.Message };
return Json(output);
}
[HttpPost]
public ActionResult MyViewModel2Validator(MyViewModel2 model)
{
var validator = model.Validate();
var output = from Error e in validator.Errors
select new { Field = e.FieldName, Message = e.Message };
return Json(output);
}
Это прекрасно работает, но если бы у меня было 30 различных типов моделей представления, то было быдолжно быть 30 отдельных действий контроллера, все с идентичным кодом, кроме сигнатуры метода, что кажется плохой практикой.
Мой вопрос, как я могу объединить эти действия проверки так, чтобы яможет передавать любую модель представления и вызывать ее метод Validate (), не заботясь о том, какой это тип?
Сначала я попытался использовать сам интерфейс в качестве параметра действия:
public ActionResult MyViewModelValidator(IMyViewModel model)...
Но это не сработало: я получил исключение Cannot create an instance of an interface
.Я думал, что экземпляр модели будет передан в действие контроллера, но, очевидно, это не тот случай.
Я уверен, что упускаю что-то простое.Или, возможно, я только что подошел ко всему неправильно.Кто-нибудь может мне помочь?