2011-11-29 57 views
2

假設你正在ASP.NET MVC中開發你自己的stackoverflow :-)ASP.NET MVC - 只發布一半類型視圖的模型?

你想有一個功能來回答問題。因此,該視圖應該包含原始問題的詳細信息(標題,文本等),並且還應該包含提交答案的表單。爲了渲染視圖,您應該提供原始問題對象和新的空答案對象。然後你只需要回覆。

如何定義此視圖的類型?你會實現一個特定於這個視圖的視圖模型,它將包含這個問題和一個空的答案嗎?這裏常用的方法是什麼?

想法,我有如下:

  1. 使用同時包含問題和答案專門的視圖模型對象。視圖被綁定到這個對象。渲染視圖時,使用問題詳細信息。回發時,我在控制器中獲得的對象只有填充了與應答相關的字段。

  2. 使用ViewBag來傳遞問題對象。視圖必然會回答模型。

(沒有AJAX請,只是非常基本的場景)

回答

1

你的問題並沒有多大意義。你的問題不會被回發,因爲只有表單控件發佈,如輸入,按鈕值等。你的問題只是HTML文本,並沒有張貼。

+0

那麼,答案是什麼?它是一個包含問題和答案的特殊模型視圖對象嗎? – agibalov

+0

你可以做任何你提到的情況。儘管如此,我還是希望讓所有動態數據都處於視圖模型中。這是個人喜好。 –

1

您將返回問題以及作爲模型到頁面的任何答案。在底部,你會想要一個表單提交一個帶有給定問題ID的AnswerModel。

您可能會創建一個默認的AnswerModel,當您渲染視圖時會傳遞下去,但是您不打算工作(或擔心)問題並回答'對象'模型。您可以創建一個包含問題和當前答案列表的ThreadViewModel。

1

我要做的就是創建四個接口:

public IQuestionDetail 
{ 
    string QuestionText { get; } 
    // Question Details 
} 
public IQuestionView 
{ 
    IQuestionDetail QuestionDetail { get; } 
} 
public IAnswerDetail 
{ 
    int/guid QuestionID { get; } 
    string AnwerText { get; } 
    // Anwer Details 
} 
public IAnswerView 
{ 
    IAnswerDetail AnswerDetail { get; } 
} 

然後我得到4類

public QuestionDetail : IQuestionDetail 
{ //implemented } 

public AnswerDetail : IAnswerDetail 
{ //implemented } 

public QuestionViewModel : IQuestionView, IAnswerView 
{ //implemented } 

public AnswerModel : IAnswerView 
{ //implemented } 

的單一視圖(問題/ Detail.cs)

@model Models.QuestionViewModel 

@html.Partial("partial-questionDetails", Model) 

@html.Partial("partial-answerDetails", Model) 

兩個部分Views

//partial-questionDetails.cshtml 
@model Models.IQuestionView 

@Html.DisplayFor(Model.QuestionDetail) 

//partial-answerDetails.cshtml 
@model Models.IAnswerView 

@Html.BeginForm() 
{ 
    Html.EditorFor(Model.AnswerDetail) 
} 

QuestionController

public ActionResult Detail(IAnswerView AnswerModel) 
{ 
    // AnswerModel is only populated with the Answer Fields 
    // Do Stuff with AnswerModel 

    QuestionViewModel viewModel = new QuestionViewModel() 
    View(viewModel); 
} 
+0

非常有趣的想法,但我不喜歡你的方法需要的一些類/接口:-) – agibalov

+0

它可以很容易地簡化,但我喜歡可擴展性接口提供。 –

0

當ASP.NET MVC建築形式,我通常創建兩個單獨的類,一個用於填充視圖(視圖模型),另一個用於在提交接收數據。 ViewModel(通常只讀)可能包含填充視圖所需的附加信息,但數據對象只具有用於提交表單的屬性(使用公共設置器)。

這些類將有幾個共同的屬性,以便ASP.NET MVC中的模型綁定將正確連接。對於簡單的表單,我並不總是爲每個視圖提取單獨的接口,但如果要確保屬性匹配,那麼接口是一種簡單的方法。

爲此,您將創建一個接口,其屬性表示表單字段。然後,讓每個類實現接口,這將爲您提供編譯時保證兩個類中都存在表單字段。