2

Ich bin ziemlich neu in MVC. Ich verwende eine interface als eine Eigenschaft für mein Modell.MVC3 Model Bindung mit Schloss

Ich bemerkte, dass meine Data Annotation Attributes ignoriert wurden. Ich habe auch einen Fehler beim Absenden des Formulars:

Kann keine Instanz einer Schnittstelle erstellen.

Ich dachte bald heraus, dass muss ich werde eine benutzerdefinierte ModelBinder

ich habe harte Zeit herauszufinden, was in der CreateModel Methode des ModelBinder

getan werden muss ich folgendes RegistrationModel haben :

public class RegistrationModel 
{ 
    #region Properties (8)  

    public string Email { get; set; } 

    public string FirstName { get; set; } 

    public Gender Gender { get; set; } 

    public string LastName { get; set; } 

    public string Password { get; set; } 

    public string PasswordConfirmation { get; set; } 

    public IPlace Place { get; set; } 

    public string Username { get; set; } 

    #endregion Properties  
} 

Hier ist die IPlace Schnittstelle und Implementierung:

public interface IPlace 
{ 
    #region Data Members (7)  

    string City { get; set; } 

    string Country { get; set; } 

    string ExternalId { get; set; } 

    Guid Id { get; set; } 

    string Name { get; set; } 

    string Neighborhood { get; set; } 

    string State { get; set; } 

    #endregion Data Members  
} 

public class Place : IPlace 
{ 
    #region Implementation of IPlace 

    public Guid Id { get; set; } 

    [StringLength(100, ErrorMessage = "City is too long.")] 
    public string City { get; set; } 

    [StringLength(100, ErrorMessage = "Country is too long.")] 
    public string Country { get; set; } 

    [StringLength(255, ErrorMessage = "External ID is too long.")] 
    public string ExternalId { get; set; } 

    [Required(ErrorMessage = "A name is required.")] 
    [StringLength(450, ErrorMessage = "Name is too long.")] 
    [DisplayName("Location")] 
    public string Name { get; set; } 

    [StringLength(100, ErrorMessage = "Neighborhood is too long.")] 
    public string Neighborhood { get; set; } 

    [StringLength(100, ErrorMessage = "State is too long.")] 
    public string State { get; set; } 

    #endregion 
} 
+1

Wozu dient hier die Schnittstelle? Befreien Sie sich davon und nutzen Sie eine Klasse "Place" –

Antwort

2

Sie sollten versuchen, Interfaces und abstrakte Typen in Ihren Ansichtsmodellen zu vermeiden. Wenn in Ihrem Fall die Controller-Aktion, die dieses Ansichtsmodell verwendet, niemals eine andere Implementierung von IPlace als Place haben kann, dann ersetzen Sie einfach die Schnittstelle.

Wenn Sie es aus irgendeinem Grund benötigen, wie Sie bereits herausgefunden haben, müssen Sie ein benutzerdefiniertes Modellbinder schreiben, in dem Sie angeben, welche Implementierung Sie erstellen möchten. Hier ist an example.