2017-07-23 63 views
0

我有大約7個模型擁有相同的屬性(屬性)。在查看頁面我使用的模型(名稱= commonModel),其中包含所有這些屬性和一個額外的屬性來選擇在哪個模型的數據庫我想保存發送的數據,所以我創建了一個valuesRelocate方法,將所有屬性的commonModel分配給選擇模型(在本例中爲文章)。 我在下面給出的代碼正在工作,但在將commonModel的屬性的值分配給文章屬性時出現錯誤。 有什麼更好的方法來做到這一點。 錯誤是在tempModel.question錯誤1061. T不包含<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; 
    } 

我使用名爲baseGrammar .CODE一個抽象基類爲兩個類如下所示

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

上面示出的一個是基類 和示出的那些下面是派生類 我使用不同的類,因爲我想爲不同的語法概念有不同的類。

public class article : baseGrammar 
{ 

} 

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

希望這會有所幫助。

+2

您的模型是否有相同的基類,或實現一個接口? (除了別的之外,我會*強烈*建議你開始遵循.NET命名約定。) –

+0

你能告訴哪行代碼顯示錯誤嗎?你也可以分享'valuesRelocate'方法的代碼嗎? –

+0

我在valuesRelocate方法裏提供了valueRelocate方法的代碼和tempModel.question中的問題,顯示錯誤。 @ChetanRanpariya – himanshu

回答

1

你只需要約束類型參數T從您的基類派生:

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

然而,考慮到你正在修改的傳入模式,你可以刪除的返回值,只是改變方法:

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

然後在您的調用代碼:

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

有沒有必要有兩個單獨的變量,無論如何將指向同一個對象...

+0

@himanshu:對不起,我的意思是它是'BaseGrammar',而不是'CommonModel'。關鍵是該屬性是在基類中聲明的。編輯。 –

+0

對不起,但這不會工作,因爲我的主要目標是將CommonModel轉換爲其他模型,在這種情況下是文章,但它可以是生產環境中的任何名詞或代詞。 但是你在這裏從CommonModel改爲CommonModel。 需要做什麼是Article.Property = CommonModel。屬性 然而,它現在正在工作,當我指定的地方T:BaseGrammar,但我覺得我的應用程序工作速度較慢@JonSkeet – himanshu

+1

@himanshu:請參閱我以前的回覆您現在刪除的評論。至於你的應用程序「工作較慢」 - 之前它根本不工作,因爲它沒有編譯。我所提供的代碼將不會有任何顯着的性能影響... –

相關問題