MVC页面显示一个模型,但让你创建一个不同的模型

时间:2014-01-12 15:26:54

标签: asp.net-mvc

为MVC页面创建不同模型类型的输入的正确方法是什么?我可以直接输入我需要的HTML,但是如何使用“Html.EditorFor”等惯用方法呢。

例如,在Stack溢出中,您正在查看帖子,但在底部您正在创建答案。 IEnumerable应该成为帖子模型的一部分吗?

3 个答案:

答案 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)
}