w mojej aplikacji ASP.NET MVC, mam interfejs, który działa jako szablonu dla kilku różnych modeli Widok:Przechodząc interfejs do metody działania ASP.NET MVC Controller
public interface IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
Validator Validate();
}
Więc, moim zdaniem modele są zdefiniowane następująco:
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
}
}
Potem mają obecnie oddzielne działania kontrolera do zrobienia walidacji dla każdego innego rodzaju, za pomocą wiązania model:
[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);
}
To działa dobrze, ale gdybym miał 30 różnych typów modeli widoku, musiałoby być 30 osobnych akcji kontrolera, wszystkie z identyczny kod oprócz podpisu metody, która wydaje się zła praktyka.
Moje pytanie brzmi: jak mogę skonsolidować te działania sprawdzania poprawności, aby można było przekazać dowolny model widoku i nazwać go metodą sprawdzania poprawności (Validate), nie dbając o to, jaki to jest?
Początkowo próbowałem przy użyciu samego interfejsu jako parametr działania:
public ActionResult MyViewModelValidator(IMyViewModel model)...
Ale to nie działa: Dostaję Cannot create an instance of an interface
wyjątek. Myślałem, że przykład tego modelu zostanie przekazany do działania kontrolera, ale najwyraźniej tak nie jest.
Jestem pewien, że brakuje mi czegoś prostego. A może właśnie podjąłem się tego wszystkiego źle. Czy ktoś może mi pomóc?
Poszedłem na to podejście w końcu wyłącznie ze względu na ograniczenia czasowe, ale wyjaśniłeś również, dlaczego obiekt nie jest już instancją, kiedy jest przekazywany do kontrolera, co jest przydatne do poznania. –