2017-07-23 3 views
0

J'ai environ 7 modèles qui ont les mêmes propriétés (attributs). Sur la page de vue j'utilise un modèle (name = commonModel) qui contient toutes ces propriétés et une propriété supplémentaire pour choisir dans quelle base de données de modèle je veux enregistrer les données envoyées ainsi j'ai créé une méthode valuesRelocate qui assignera toutes les propriétés de commonModel à le modèle choisi (dans ce cas l'article). Le code que j'ai donné ci-dessous fonctionne mais j'obtiens une erreur lors de l'affectation de la valeur d'une propriété de commonModel à une propriété d'article. Quelle est la meilleure façon de le faire. erreur est à tempModel.questionerreur 1061. T ne contient pas une définition de <propertyName>

public ActionResult Create([Bind(Include = 
    "Id,question,ans,ruleApplicable,hint,exception,modelSelector")] 
    commonModel commonModel) 
    { 
     if (ModelState.IsValid) 
     { 

      if (commonModel.modelSelector == "article") 
      { 
       article model2 = new article(); 
       article model1 = valuesRelocate<article>(commonModel, 
    model2); 
       db.articleDb.Add(model1); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
     } 

      return View(commonModel); 
    } 

    private T valuesRelocate<T>(commonModel commonModel, T tempModel) { 

     tempModel.question = commonModel.question; 
     return tempModel; 
    } 

J'utilise une classe de base abstraite nommée baseGrammar .code tant pour la classe est indiquée ci-dessous

public abstract class baseGrammar 
{ 
    [Key] 
    public int Id { get; set; } 
    [Required] 
    public string question { get; set; } 
    [Required] 
    public string ans { get; set; } 
    public string ruleApplicable { get; set; } 
    public string hint { get; set; } 
    public bool exception { get; set; } 
} 

celui indiqué ci-dessus est la classe de base et ceux indiqués ci-dessous sont des classes dérivées J'utilise différentes classes parce que je voulais avoir différentes classes pour différents concepts grammaticaux.

public class article : baseGrammar 
{ 

} 

public class commonModel : baseGrammar 
{ 
    [Required] 
    public string modelSelector { get; set; } 
} 

espérons que cela aide.

+2

Vos modèles ont-ils la même classe de base, ou implémenter une interface? (Mis à part toute autre chose, je vous * conseille * fortement de commencer à suivre les conventions de nommage .NET.) –

+0

Pouvez-vous dire quelle ligne de code montre une erreur? Pouvez-vous partager le code de la méthode 'valuesRelocate' aussi? –

+0

J'ai fourni le code de la méthode valuesRelocate et la question dans tempModel.question à l'intérieur de la méthode valuesRelocate qui montre une erreur. @ChetanRanpariya – himanshu

Répondre

1

Vous avez juste besoin de Contraindre le paramètre de type T à dériver de votre classe de base:

// Names changed to follow .NET naming conventions 
private T RelocateValues<T>(BaseGrammar baseModel, T tempModel) 
    where T : BaseGrammar 
{ 
    tempModel.question = baseModel.question; 
    return tempModel; 
} 

Cependant, étant donné que vous modifiez le modèle entrant, vous pouvez supprimer la valeur de retour et juste changer la méthode:

private void RelocateValues(BaseGrammar from, BaseGrammar to) 
{ 
    to.question = from.question; 
} 

Puis dans votre code d'appel:

Article model = new Article(); 
RelocateValues(model); 
db.ArticleDb.Add(model); 

Il n'est pas nécessaire d'avoir deux variables distinctes qui se référeront au même objet de toute façon ...

+0

@himanshu: Désolé, je voulais dire que c'est' BaseGrammar', pas 'CommonModel'. Le point est que la propriété est déclarée dans la classe de base. Édité. –

+0

Désolé mais cela ne marchera pas parce que mon but principal est de convertir le CommonModel à d'autres modèles qui dans ce cas est l'article mais il pourrait être n'importe quel nom ou pronom dans l'environnement de production. Mais vous faites ici des changements de CommonModel à CommonModel. Ce qui doit être fait est Article.Property = CommonModel.Propriété Cependant, il fonctionne maintenant lorsque j'ai spécifié où T: BaseGrammar mais je sens que mon application fonctionne plus lentement maintenant @JonSkeet – himanshu

+1

@himanshu: S'il vous plaît voir ma réponse précédente à votre commentaire maintenant supprimé. En ce qui concerne votre application "travailler plus lentement" - cela ne fonctionnait pas du tout * avant, car elle ne compilait pas. Le code que j'ai fourni n'aura aucun impact de performance significatif du tout ... –