我有一個示例項目,一個動態調查問卷系統,任何管理員都可以創建問卷,然後向其添加問題組並向每個問題組添加問題。實體框架POCO到MVC中的ViewModel 3
採取以下組波蘇斯的是彌補我的EF數據對象的實體:
public class Questionnaire
{
public virtual int Id { get; set; }
public virtual string QuestionnaireName { get; set; }
public virtual IList<QuestionGroup> QuestionGroups { get; set; }
}
public class QuestionGroup
{
public virtual int Id { get; set; }
public virtual string GroupName { get; set; }
public virtual int QuestionnaireId { get; set; }
public virtual IList<Question> Questions { get; set; }
}
public class Question
{
public virtual int Id { get; set; }
public virtual string QuestionText { get; set; }
public virtual int QuestionGroupId { get; set; }
public virtual QuestionGroup QuestionGroup { get; set; }
}
我訪問這些金融機構在通過WCF數據服務我的Web UI,我想知道什麼是最好的做法(或至少一個更清潔的方式)處理在我看來這些實體的輸入。以下是我所能克服的一些想法,但我很難喜歡它們中的任何一個,因爲它們只是感覺錯綜複雜。
解決方案1
一個屬性添加到我的Question
實體,稱爲SubmittedValue
,並有我的EF數據上下文Ignore(m => m.SubmittedValue)
這一點。此屬性是我將用於在視圖級別保留Question
的輸入值。
我不喜歡這件事,它讓我的POCO實體膨脹得幾乎不相關的屬性 - 我只在一個Web UI中使用SubmittedValue
,而我的POCO實體會在其他地方多次使用。
解決方案2
創建具有相同的結構,我的波蘇斯視圖模型對象,讓我們稱他們爲QuestionnaireModel
,QuestionGroupModel
和QuestionModel
- 這些都是在我的控制器初始化,屬性是從POCO複製到視圖模型。在QuestionModel
我添加了我的SubmittedValue
屬性,並使用自定義模型綁定器來查看綁定上下文並從視圖中獲取我的值 - 其中名稱看起來像[group.question.1](其中1是Id的Id問題)。這是在視圖中爲每個問題組和每個問題使用編輯模板呈現的。
我不喜歡這件事,是膨脹我的Web UI與這些額外的視圖模型對象,並不得不手動複製屬性值從我的POCO到視圖模型。我知道我可以使用像AutoMapper這樣的東西來爲我做這件事,但這只是自動化這項工作,我理想中完全不想這樣做。
溶液3
更改溶液2性能稍微,以代替致以波蘇斯並重寫與其它視圖模型對象virtual
集合屬性。所以,我的觀點模型是這樣的:
public class QuestionnaireModel : Questionnaire
{
public new IList<QuestionGroupModel> QuestionGroups { get; set; }
}
public class QuestionGroupModel : QuestionGroup
{
public new IList<Question> Questions { get; set; }
}
public class QuestionModel : Question
{
public string SubmittedValue { get; set; }
}
我喜歡這個想法是最好的,但我沒有真正嘗試過這個呢。我在這裏得到兩全其美的好處1.我可以讓我的POCO遠離我的觀點,並且2.我將這個一次性使用屬性SubmittedValue
排除在我的業務層之外。
你們有沒有更好的方法來處理這個問題?
請謹慎編寫這樣的編輯器模板,因爲它是潛在的腳本注入威脅,因此不建議生成這樣的html控件。爲什麼不簡單地將'@ model'設置爲'QuestionModel',然後在編輯器模板中使用'Html.TextBoxFor(x => x)'helper?我能夠解決這樣的類似問題,並通過將後置動作的參數設置爲'List模型,即使擺脫了定製模型聯編程序,但在控制器中具有邏輯。只是一些提示... –
thmshd