2

Я довольно новичок в MVC. Я использую interface как свойство для моей модели.MVC3 Model Binding with Castle

Я заметил, что мои Data Annotation Attributes игнорировались. Я также получил сообщение об ошибке:

Невозможно создать экземпляр интерфейса.

скоро я понял, что мне придется использовать пользовательский ModelBinder

Я имею трудно понять, что должно быть сделано внутри CreateModel способа ModelBinder

Я следующий RegistrationModel :

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  
} 

Вот интерфейс и реализация IPlace:

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

Какой смысл использовать интерфейс здесь? Избавьтесь от него и используйте класс «Место», –

ответ

2

Вы должны стараться избегать использования интерфейсов и абстрактных типов в своих моделях просмотра. Поэтому в вашем случае, если действие контроллера, использующее эту модель представления, никогда не может иметь никакой другой реализации IPlace, чем Place, чем просто заменить интерфейс.

Если по какой-то причине вам это было необходимо, как вы уже выяснили, вам нужно будет написать настраиваемое связующее устройство, в котором вы укажете, какую реализацию вы хотите создать. Вот an example.