2010-05-14 3 views
1

인터페이스에 관한 작은 문제가 있습니다. 나는이 전화를 할 때마다 나는 내가 완전히 올바른 유형의 인스턴스를 만들 수 없다는 예외가MVC에서 인터페이스를 유형으로 변환합니다.

[HttpPost()] 
public void Update(IAuctionItem item) { 
    RedirectToAction("List"); 
} 

:

이 코드를 생각해 보자. 그러나 실제로 구체적인 유형을 사용하지 않고 인터페이스가 매핑해야하는 것을 알려주는 방법이 있습니까?

답변

0

콘크리트 (기본) 유형을 사용하고 내부적으로 인터페이스를 테스트 할 수 있습니까?

[HttpPost()] 
public void Update(BaseItem item) 
{ 
    if (item is IActionItem) 
     RedirectToAction("List"); 
    else 
     // do something else 
} 
0

기본 모델 바인더가 "IAuctionItem"인스턴스를 생성하려고 시도하는 것처럼 보입니다.이 모델은 작업에서 요구하는 유형입니다.

두 가지 해결책은 다음과 같습니다.

가) 구체적인 유형을 허용하도록 동작을 변경하십시오.
B) 기본 모델 바인더를 "IAuctionItem"을 구현하는 콘크리트 형식의 인스턴스를 반환하는 사용자 지정 모델 바인더로 바꿉니다.

MVCContrib (내가 생각하는)의 일부인 Smart Model Binder에 대한 Google이 있으십시오. 스마트 모델 바인더를 사용하면 사용자 정의 모델 바인더를 작성하고 사용자 정의 바인더가 원하는 유형을 처리하지 못하면 기본 바인더로 다시 드롭 할 수 있습니다.

희망이 도움이됩니다.

1

이것은 내 해결책이되었습니다. 모두 도와 주셔서 감사합니다.

[HttpPost()] 
public void Update([ModelBinder(typeof(AuctionItemModelBinder))]IAuctionItem item) { 
    repository.Update(item); 

    RedirectToAction("List"); 
} 

및 내 사용자 지정 모델 바인더.

public class AuctionItemModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) { 

     NameValueCollection form = controllerContext.HttpContext.Request.Form; 

     Registry registry = new Registry(); 
     var item = registry.ResolveTypeFrom<IAuctionItem>(); 
     item.Description = form["title"]; 
     item.Price = int.Parse(form["price"]); 
     item.Title = form["title"]; 

     //TODO: Stop hardcoding this 
     item.UserId = 1; 

     return item; 
    } 
} 
관련 문제