2017-02-09 98 views
0

我有一个控制器有两个动作。构建MVC应用程序的正确方法

使用实体框架获取数据库请求列表的第一个操作,然后视图显示它们。

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; } 
} 

如果你看一下视图代码I输出一个链接,将用户带到首页/ SendResponse /编号

这就是我不确定性的地方。

SendResponse操作的目的是回复特定的请求。在SendResponse视图中,我想显示一些请求模型字段,以便作者知道应包含哪些内容。

我的具体问题是

  1. 因为我想要显示从请求模型的一些数据,该视图的模型将被设置为请求模型,但视图的目的将是发送一个响应(在响应模型中定义)。所以,我应该只设置一些ViewBag。*属性设置为请求类中的字段,并使用它们而不是请求模型,然后将我的视图模型设置为响应?

  2. 有一个控制器处理两个模型(在这种情况下是请求和响应)是好的/最佳做法?

总之,我对如何构建MVC组合从一个模型中获取数据,然后创建基于该数据的新的模型只是没有100%确定。

+1

在SendResponse控制器操作中,您可以从数据库获取所提供ID的请求数据。您可以创建另一个模型类,它可以包装来自数据库的请求数据以及您想要在SendResponse视图中显示的任何其他数据。 –

+1

根据要在视图上显示的数据创建自定义模型类总是可以的。 –

+1

由于视图只接受单个模型绑定机制,所以最好设置包装两个模型的另一个视图模型。可以对创建的视图模型进行自定义以包含要传入视图的某些数据部分。 –

回答

0

一个典型的模式是为每个视图创建一个模型。在你的代码中,你直接从你的数据库发送Request对象。通常会创建一个RequestViewModel并将其发送给视图以应对。

当作者点击你的链接时,你会收到一个请求ID。您可以使用ID从数据库中检索相关的Request对象,然后将其投影到ResponseEditModel中。您在此模型中包含/声明了一些您​​希望从请求对象中包含的字段。你基本上复制它们。

控制器可以处理很多模型,我实际上建议在大多数情况下为每个视图执行一个模型。最重要的是以某种方式保持控制器的凝聚力,例如处理请求和处理响应,听起来很好。

+0

好吧,我的请求模型是一个代表数据库中数据的类,并且您正在说要将请求中的数据编组为请求视图模型,视图以及发送响应视图的响应视图模型。我喜欢这种方法 – andrewb

相关问题