假设您正在ASP.NET MVC中开发自己的stackoverflow: - )
您希望有一个功能来回答问题。因此,视图应包含原始问题详细信息(标题,文本等),并且还应包含提交答案的表单。为了呈现视图,您应该提供原始问题对象和新的空答案对象。然后,您只希望回复回复。
您如何定义此视图的类型?您是否会实现特定于此视图的视图模型,其中包含问题和空答案?这里常见的方法是什么?
我的想法是:
使用包含问题和答案的特殊视图模型对象。视图绑定到此对象。渲染视图时,使用问题详细信息。回发时,我在控制器处获得的对象仅填充了与答案相关的字段。
使用ViewBag
传递问题对象。视图必然会回答模型。
(请不要使用AJAX,只是最基本的情况)
答案 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中的模型绑定将正确连接。对于简单表单,我并不总是为每个视图提取单独的接口,但如果要保证属性匹配,那么接口是一种简单的方法。
为此,您将创建一个单独的接口,其属性表示表单字段。然后,让每个类实现接口,这将为您提供编译时保证两个类上都存在表单字段。