ASP.NET MVC - 只发布了一半类型视图的模型?

时间:2011-11-29 18:29:39

标签: c# .net asp.net-mvc

假设您正在ASP.NET MVC中开发自己的stackoverflow: - )

您希望有一个功能来回答问题。因此,视图应包含原始问题详细信息(标题,文本等),并且还应包含提交答案的表单。为了呈现视图,您应该提供原始问题对象和新的空答案对象。然后,您只希望回复回复。

您如何定义此视图的类型?您是否会实现特定于此视图的视图模型,其中包含问题和空答案?这里常见的方法是什么?

我的想法是:

  1. 使用包含问题和答案的特殊视图模型对象。视图绑定到此对象。渲染视图时,使用问题详细信息。回发时,我在控制器处获得的对象仅填充了与答案相关的字段。

  2. 使用ViewBag传递问题对象。视图必然会回答模型。

  3. (请不要使用AJAX,只是最基本的情况)

4 个答案:

答案 0 :(得分:1)

你的问题没有多大意义。您的问题不会被回发,因为只发布了表单控件,例如输入,按钮值等。您的问题只是html文本,并且不会发布。

答案 1 :(得分:1)

您将返回问题,并将任何答案作为您的模型返回页面。在底部,您将需要一个提交带有给定问题ID的AnswerModel的表单。

您可以创建一个默认的AnswerModel,它在渲染视图时会传递下去,但您不会工作(或担心)问题并回答'对象'只是模型。您可以创建一个包含问题和当前答案列表的ThreadViewModel。

答案 2 :(得分: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 }

单一视图(Question / Detail.cs)

@model Models.QuestionViewModel

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

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

两个部分观点

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

答案 3 :(得分:0)

在ASP.NET MVC中构建表单时,我通常创建两个单独的类,一个用于填充视图(ViewModel),另一个用于接收提交数据。 ViewModel(通常是只读的)可能包含填充视图所需的其他信息,但数据对象仅具有用于提交表单的属性(使用公共setter)。

这些类将具有多个共同属性,因此ASP.NET MVC中的模型绑定将正确连接。对于简单表单,我并不总是为每个视图提取单独的接口,但如果要保证属性匹配,那么接口是一种简单的方法。

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