2014-04-29 5 views
0

다음과 같은 모델을 가졌 : 나는 다음과 같은 예외가 public JsonResult SaveModel(SomeModel model){ ... }에 POST 요청을있을 때인터페이스 모델 - 일반적인 목록 구성원은

public class SomeModelAttribute<T> : ISomeModel { 
    public string Name { get; set; } 
    public T Value { get; set; } 
} 

public class SomeModel { 
    public IEnumerable<ISomeModel> Attributes { get; set; } 
} 

을 : Cannot create an instance of an interface.

이 얻을 상식이다 이 오류는 있지만이 작업을 모델 바인더가 IEnumerable의 목록을 만드는 것과 비슷하게 만드는 방법이 있습니까? 그래서 SomeModel 내부에 SomeModelAttribute의 인스턴스를 게시 할 수 있었습니까?

감사합니다.

답변

1

솔루션 : 맞춤형 모델 바인더를 발견했습니다. 다음과 같이 사용자 정의 모델 바인더를 만든 :

public class SomeModelModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType == typeof(ISomeModel)) 
     { 
      HttpRequestBase request = controllerContext.HttpContext.Request; 
      bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Value"); 

      [some logic to return a new SomeModelAttribute<something>();] 
     } 
     else 
     { 
      return base.BindModel(controllerContext, bindingContext); 
     } 
    } 
} 
ISomeModel에

추가 ModelBinder를 속성 우리가 사용할 수있는 사용자 정의 바인더 지정할 수 있도록 :

[ModelBinder(typeof(SomeModelModelBinder))] 
public interface ISomeModel { ... } 

잇이 짜잔 ... 유사한 작동을 매력 :

0

모델 바인딩은 바인딩하기 전에 인스턴스를 만듭니다. 우리는 ISomeModel을 구현 한 인터페이스 객체를 사용하여 인스턴스를 만들 수 없습니다.