ASP.. NET MVC -只返回一半的类型化视图模型
本文关键字:类型化 视图 模型 一半 返回 NET MVC -只 ASP | 更新日期: 2023-09-27 18:16:02
假设您正在用ASP开发自己的stackoverflow。. NET MVC:-)
你希望有一个回答问题的功能。因此,视图应该包含原始问题的详细信息(标题、文本等),还应该包含提交答案的表单。为了呈现视图,您应该同时提供原始问题对象和新的空答案对象。然后,您只希望回复。
如何定义这个视图的类型?您是否会为这个视图实现一个特定的视图模型,它将同时包含问题和空答案?这里常见的方法是什么?
我的想法是:
-
使用包含问题和答案的特殊视图模型对象。视图被绑定到这个对象。在呈现视图时,将使用问题详细信息。当发回时,我在控制器中得到的对象只具有与答案相关的字段填充。
-
使用
ViewBag
传递问题对象。视图绑定回答模型 -
?
(请不要AJAX,只是非常基本的场景)
你的问题没有多大意义。您的问题不会被张贴回来,因为只有表单控件张贴,如输入,按钮值等。你的问题只是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将正确地连接起来。对于简单的表单,我并不总是为每个视图提取单独的接口,但是如果您想保证属性匹配,那么接口是一种简单的方法。
要做到这一点,您将创建一个接口,其属性表示表单字段。然后,让每个类实现接口,这将为您提供一个编译时的保证,即表单字段存在于两个类中。