Ich habe einige Experimente mit ASP.NET MVC2 ausgeführt und bin auf ein interessantes Problem gestoßen.DataAnnotation Validierungen und Custom ModelBinder
Ich möchte eine Schnittstelle um die Objekte definieren, die als Modelle in der MVC-App verwendet werden. Außerdem möchte ich die neue DataAnnotation funktionell nutzen, indem ich die Mitglieder dieser Schnittstelle mit Validierungsattributen auszeichne.
Also, wenn meine Seite ein "Foto" Objekt hat, werde ich die folgende Schnittstelle definieren:
public interface IPhoto
{
[Required]
string Name { get; set; }
[Required]
string Path { get; set; }
}
Und ich werde die folgende Implementierung definieren:
public class PhotoImpl : IPhoto
{
public string Name { get; set; }
public string Path { get; set; }
}
Meine MVC App Controller könnten gehören Methoden wie:
public class PhotoController : Controller
{
[HttpGet]
public ActionResult CreatePhoto()
{
return View();
}
[HttpPost]
public ActionResult CreatePhoto(IPhoto photo)
{
if(ModelState.IsValid)
{
return View();
}
else
{
return View(photo);
}
}
}
Und schließlich, um PhotoImpls auf die Parameter in dieser ac zu binden tion Methoden, könnte ich die folgenden Erweiterungen die Default implementieren:
public class PhotoModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if(bindingContext.ModelType == typeof(IPhoto))
{
IPhoto photo = new PhotoImpl();
// snip: set properties of photo to bound values
return photo;
}
return base.BindModel(controllerContext, bindingContext);
}
}
Alles scheint groß zu arbeiten, mit der Ausnahme, dass die ModelState.IsValid Eigenschaft in meinem Controller erscheint nicht ungültige Werte (zum Beispiel null) zu bemerken, in die Eigenschaften [Erforderlich] der IPhoto-Implementierung.
Ich vermute, dass ich vernachlässige, um ein wichtiges Stück Staat in meiner ModelBinder-Implementierung zu setzen. Irgendwelche Hinweise?
Vielen Dank für die Antwort. Es scheint kein Problem mit der Position des Attributs [Erforderlich] zu sein. Das Problem wird fortgesetzt, wenn ich die Attribute in PhotoImpl verschiebe, den Controller für die Verwendung in PhotoImpl ändere und den ModelBinder so umschalte, dass er auf Anfragen für PhotoImpl reagiert. Umgekehrt funktionieren die Validierungen korrekt, wenn ich meinem ModelBinder befehle, nicht auf PhotoImpl zu reagieren und auf die standardmäßige ModelBinder-Implementierung zurückzugreifen. –