2011-11-29 33 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中的模型绑定将正确连接。对于简单的表单,我并不总是为每个视图提取单独的接口,但如果要确保属性匹配,那么接口是一种简单的方法。

为此,您将创建一个接口,其属性表示表单字段。然后,让每个类实现接口,这将为您提供编译时保证两个类中都存在表单字段。