В моем приложении ASP.NET MVC, у меня есть интерфейс, который действует как шаблон для нескольких различных моделей Вид:Передача интерфейс для метода 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
исключение. Я думал, что экземпляр модели будет передан в действие контроллера, но, видимо, это не так.
Уверен, что я пропустил что-то простое. Или, возможно, я только что подошел ко всему этому. Может кто-нибудь мне помочь?
Я пошел на этот подход в конце концов из-за ограничений по времени, но вы также объяснили, почему объект еще не является экземпляром, когда он передается в контроллер, что полезно знать. –