为MVC页面创建不同模型类型的输入的正确方法是什么?我可以直接输入我需要的HTML,但是如何使用“Html.EditorFor”等惯用方法呢。
例如,在Stack溢出中,您正在查看帖子,但在底部您正在创建答案。 IEnumerable应该成为帖子模型的一部分吗?
答案 0 :(得分:1)
您可以在页面的视图模型中包含这两个模型。例如,假设您正在查看帖子并希望允许用户对帖子发表评论。您的页面视图模型如下所示:
public class ViewPostViewModel
{
// The view model for the post and replies
public PostViewModel Post { get; set; }
// The view model for the comment form
public AddCommentViewModel Comment { get; set; }
}
这是我在同一页面中包含两个视图模型的首选方法,特别是如果您需要在多个不同的操作方法中重用其中一个视图模型。
然后在您的视图中,您可以使用标准@Html.EditorFor(m => m.Comment.Message)
帮助程序创建表单输入,或使用部分视图呈现评论表单。
答案 1 :(得分:0)
使用局部视图,然后你可以这样:
你的部分:
@model stackoverflow.answer
@HTML.desplaynamefor(u => u.name)
然后在另一个视图中你可以这样做
@model stackoverflow.post
@HTML.displaynamefor(u => u.comment)
@partial("mypartial",new answer())
答案 2 :(得分:0)
如果你只创建一个没有来自服务器端的数据的新答案(没有服务器端验证,编辑等),你可以实例化模型,然后使用部分视图作为答案形式:
QuestionView:
@model ViewModel.Question
@{ var answer = new ViewModel.Answer(); }
<h3>Question:</h3>
@Html.DisplayTextFor(m => m.Text)
@Html.Partial("AnswerFormView", answer)
AnswerFormView:
@model ViewModel.Answer
@using (var form = Html.BeginForm(...))
{
<h3>Answer:</h3>
@Html.EditorFor(m => m.Text)
}
如果您需要服务器端的数据(验证,默认值,编辑等),您需要从控制器获取数据并使用合成视图。
ViewModel.Composed:
public class Composed
{
public ViewModel.Question Question { get; set; }
public ViewModel.Answer Answer { get; set; }
}
ComposedView:
@model ViewModel.Composed
@Html.Partial("QuestionView", Model.Question)
@Html.Partial("AnswerFormView", Model.Answer)
QuestionView:
@model ViewModel.Question
<h3>Question:</h3>
@Html.DisplayTextFor(m => m.Text)
AnswerFormView:
@model ViewModel.Answer
@using (var form = Html.BeginForm(...))
{
<h3>Answer:</h3>
@Html.EditorFor(m => m.Text)
}