ASP.. NET MVC -只返回一半的类型化视图模型

本文关键字:类型化 视图 模型 一半 返回 NET MVC -只 ASP | 更新日期: 2023-09-27 18:16:02

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

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

如何定义这个视图的类型?您是否会为这个视图实现一个特定的视图模型,它将同时包含问题和空答案?这里常见的方法是什么?

我的想法是:

  1. 使用包含问题和答案的特殊视图模型对象。视图被绑定到这个对象。在呈现视图时,将使用问题详细信息。当发回时,我在控制器中得到的对象只具有与答案相关的字段填充。

  2. 使用ViewBag传递问题对象。视图绑定回答模型

  3. ?

(请不要AJAX,只是非常基本的场景)

ASP.. NET MVC -只返回一半的类型化视图模型

你的问题没有多大意义。您的问题不会被张贴回来,因为只有表单控件张贴,如输入,按钮值等。你的问题只是html文本,并没有得到张贴。

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

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

我所做的是创建四个接口:

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

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

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

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