2010-05-14 5 views
1

J'ai une petite utilité concernant une interface.convertir une interface à un type en MVC

Tenir compte de ce code:

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

Chaque fois que j'appelle cela, je reçois une exception disant que je ne peux pas créer une instance de type qui i tout à fait exact. Mais existe-t-il un moyen de dire à quoi l'interface doit correspondre sans réellement utiliser le type concret?

Répondre

0

Vous pouvez utiliser le béton (base) de type, puis tester l'interface interne?

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

Il semble que le modèle de liaison par défaut tente de construire une instance de « IAuctionItem », comme c'est le type de votre action exigeant.

Deux solutions sont:

A) Changer votre action pour accepter un type concret.
B) Remplacer le modèle par défaut liant un liant modèle personnalisé qui renvoie une instance d'un type concret qui implémente « IAuctionItem ».

utilisez Google pour Smart Model Binder, qui fait partie de MvcContrib (je pense). L'utilisation du classeur de modèle intelligent vous permet d'écrire des classeurs de modèle personnalisés et de les relâcher dans le classeur par défaut si votre classeur personnalisé ne gère pas le type recherché.

Espérons que cela aide.

1

cela est devenu ma solution. Merci à tous les gars pour aider :)

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

    RedirectToAction("List"); 
} 

et mon modelbinder personnalisé.

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; 
    } 
} 
Questions connexes