In meinem ASP.NET MVC-app, habe ich eine Schnittstelle, die für verschiedene Ansichtsmodelle als Vorlage dient:Passing eine Schnittstelle zu einer ASP.NET MVC-Controller Aktion Methode
public interface IMyViewModel
{
Client Client1 { get; set; }
Client Client2 { get; set; }
Validator Validate();
}
, meine Ansicht Modelle So ist wie folgt definiert:
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
}
}
Dann habe ich noch eine separate Controller-Aktion die Validierung für jede andere Art zu tun, Modell Bindung:
[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);
}
Das funktioniert gut - aber wenn ich 30 verschiedene Ansichtsmodelltypen hätte, dann müßten 30 separate Controlleraktionen, alle mit identischen Code neben der Methodensignatur, was wie eine schlechte Praxis erscheint.
Meine Frage ist, wie kann ich diese Validierungsaktionen konsolidieren, so dass ich jede Art von Ansichtsmodell übergeben und die Validate() -Methode aufrufen kann, ohne sich darum zu kümmern, um welchen Typ es sich handelt?
Zuerst habe ich versucht, die Schnittstelle selbst als Aktionsparameter verwenden:
public ActionResult MyViewModelValidator(IMyViewModel model)...
Aber das hat nicht funktioniert: Ich habe eine Cannot create an instance of an interface
Ausnahme erhalten. Ich dachte, eine Instanz des Modells würde in die Controller-Aktion übernommen werden, aber das ist offensichtlich nicht der Fall.
Ich bin sicher, ich vermisse etwas Einfaches. Oder vielleicht habe ich das alles falsch angegangen. Kann mir jemand helfen?
Ich ging für diesen Ansatz am Ende rein aus zeitlichen Gründen, aber Sie haben auch erklärt, warum das Objekt nicht bereits eine Instanz ist, wenn es in den Controller übergeben wird, was nützlich ist zu wissen. –