我有一个带2个动作的控制器。
使用Entity Framework获取数据库请求列表的第一个操作,然后视图显示它们。
public class HomeController : Controller
{
public ActionResult HelpRequests()
{
using (var context = new MyDbContext())
{
var items = context.Requests.ToList();
return View(items);
}
}
}
观点是:
@model List<Request>
@foreach (var request in Model)
{
<tr>
<td>
@Html.DisplayFor(model => request.Id)
</td>
<td>
@Html.DisplayFor(model => request.Title)
</td>
<td>
@Html.DisplayFor(model => request.Message)
</td>
<td>
@Html.DisplayFor(mode => request.CreateDate)
</td>
<td>@Html.ActionLink("Reply", "SendResponse", new { id = request.Id })</td>
</tr>
}
最后,请求的模型是
public partial class Request
{
public int Id { get; set; }
public string Title { get; set; }
public string Message { get; set; }
public System.DateTime CreateDate { get; set; }
public Nullable<bool> Responded { get; set; }
}
如果查看视图代码,我会输出一个链接,将用户带到Home / SendResponse / id
这是我的不确定性所在。
SendResponse操作的目的是回复特定请求。在SendResponse视图中,我想显示一些请求模型字段,以便作者知道要在响应中包含什么。
我的具体问题是
因为我想从请求模型中显示一些数据,所以视图的模型将设置为请求模型,但视图的目的是发送响应(在响应中定义)模型)。那么我应该设置一些ViewBag。*属性,这些属性设置为请求类中的字段,并使用它们而不是请求模型,然后将我的视图模型设置为响应?
是否可以使用一个控制器来处理两个模型(在这种情况下是请求和响应)?
简而言之,我不是100%肯定如何构建一个MVC组合,它从一个模型中获取数据,然后根据该数据创建一个新模型。
答案 0 :(得分:0)
典型的模式是为每个视图创建一个模型。在您的代码中,您直接从数据库发送Request对象。通常会创建一个RequestViewModel并将其发送到视图以进行反对。
当作者点击您的链接时,您将收到一个请求ID。您可以使用该ID从数据库中检索相关的Request对象,然后将其投影到ResponseEditModel中。您在此模型中包含/声明要包含在请求对象中的某些字段。你基本上复制了它们。
控制器可以与许多模型一起使用,我实际上建议在大多数情况下为每个视图做一个模型。最重要的是保持控制器的内聚性,比如处理请求和处理响应,听起来不错。