MVC3模型与Castle绑定



我对MVC很陌生。我正在使用interface作为我的模型的属性。

我注意到我的Data Annotation Attributes被忽略了。我在提交表格时也遇到了一个错误:

无法创建接口的实例。

我很快就发现我必须使用自定义的ModelBinder

我很难弄清楚ModelBinderCreateModel方法内部需要做什么

我有以下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
}

您应该尽量避免在视图模型中使用接口和抽象类型。因此,在您的情况下,如果采取此视图模型的控制器操作除了Place之外,永远不能有任何其他IPlace的实现,只需简单地替换接口。

如果出于某种原因需要它,正如您已经发现的那样,您将不得不编写一个自定义模型绑定器,在其中指定要创建的实现。下面是一个例子。

相关内容

  • 没有找到相关文章

最新更新