2011-09-07 95 views
0

更新#3:整個問題MVC3動態DataAnnotation屬性StringLength

我有一個類HB:

public class HB 
{ 
    public int Id { get; set; } 

    [StringLength(3000)] 
    public string Text { get; set; } 
    public Title Title { get; set; } 

} 

和標題:

public class Title 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int MaxChar { get; set; } 
} 

之前,你可以寫一個HB(這是一種文章),你必須選擇你的標題,所以你可以確定HB.Text的StringLength。意思是,這篇文章只能有一定數量的字符,取決於作者所擁有的「標題」。例如:Title1只能寫入1000字符的「HB」,而Title2可以寫入3000字符的「HB」。所以。這意味着StringLength必須來自Title.MaxChar。最明智的方法是什麼?

標題實體是將存儲在數據庫中的前綴數據。

要一清二楚,我想實現的東西在符合:[StringLength(Title.MaxChar)]

香港專業教育學院做結構/設​​計,這種機制在Web表單一萬次,我的大腦都無法addapt MVC的,所以一些幫助將不勝感激。代碼將更受讚賞。

+0

你想做什麼?我不清楚。 –

+0

@jeremy,'[StringLength(set_by_view)]' – bzlm

+0

沒有這就是你如何嘗試做某事。這裏你的目的是什麼?你爲什麼試圖動態改變一個屬性的字符串長度?我想你可能正在嘗試做一些已經存在的機制。 –

回答

1

很確定這是不可能的,因爲書面。這使我想要強迫業務邏輯進入屬於控制器的模型。

在這種情況下,我會在Text屬性[StringLength(3000)]上設置屬性。在控制器中,驗證過程中,我會寫幾行內容:

public ActionResult (HB model) 
{ 
    if (model.Text.Length > model.Title.MaxChar){ 
     ModelState.AddModelError("Text", string.Format("Text for this Title cannot exceed {0} characters.", model.Title.MaxChar)); 
    } 

    if (ModelState.IsValid) 
    { 
     //do stuff 
     return RedirectToAction("Index"); //or something 
    } 
    else 
    { 
     return View(model); 
    } 
} 

我相信這將完成你正在嘗試做的。現在,對於標題的對象,我會拉平說出來有點在你的模型:

public class HB 
{ 
    #region Base Properties 

    public int Id { get; set; } 

    [StringLength(3000)] 
    public string Text { get; set; } 

    #endregion 

    #region Title Properties 

    public int TitleId { get; set; } 
    public string TitleName { get; set; } 
    public int TitleMaxChar { get; set; } 

    #endregion 
} 

這是假設你需要顯示在您的視圖的信息。如果您只是需要參考它來進行業務邏輯驗證,那麼只需擁有TitleId屬性,並在您需要時使用該屬性實例化控制器中的Title對象。如果這些屬性不可編輯,請不要忘記爲每個屬性設置隱藏的輸入!

+0

太棒了。看起來不錯。我會嘗試一下。 –

+0

順便說一句,注意到我在代碼中存在一個錯誤;只是修復它。另外,您的模型中的Title對象可能存在問題。在模型中傳遞複雜對象可能是一種痛苦。考慮僅向標題引用ID,並根據需要從數據存儲中獲取信息。 –

+0

是的,我注意到了。沒問題。但是,標題對象。空引用:S。我用這種方式更新了問題,但是if語句中hb.Title.MaxChar爲null。請看看:) –