【问题标题】:Beginner mvc where to call methods初学者mvc在哪里调用方法
【发布时间】:2012-03-26 15:51:10
【问题描述】:

我在 Web Forms 中做大项目并且输入了一大堆代码(可以通过少量重构来解决),所以我决定看看 mvc,似乎每个人都喜欢它而不是 web forms。

我有包含所有 LINQ to SQL 类和现有 sql db 方法的 dll 文件,我开始通过在 mvc 中重新创建这个项目来自学。我首先将我的主页从 webforms 重新创建为 razor,到目前为止一切都很好,我重新创建了一个用户控制部分视图并循环播放。 部分视图是使用 L2S 类之一进行强类型化的,问题是其中有一些原始数据。例如,我的部分视图模型是我的 L2S 类 PostDetails:它包含一些从输出准备好的数据,例如:标题、永久链接、 ViewsNumber 等,但它也包含一些原始数据,如 UserId(我需要从 dll 调用方法来获取用户名)、DateTimeCreated(我还需要在其上调用方法来获取时差),在网络表单中我会在代码隐藏中执行此操作,但是我不确定在 mvc 中的何处执行此操作,可能在控制器中并在 ViewData 中传递它。我也要求将来这样做,而不仅仅是这种情况。

【问题讨论】:

    标签: c# asp.net-mvc-4


    【解决方案1】:

    您应该在控制器中执行这些操作。控制器正是它听起来的样子,它控制模型和视图之间的数据流。

    这是一个使用您的 PostDetails 的示例:

    PostDetailsModel

    String Title {get;set;}
    String Permalink {get;set;}
    Int ViewNumber {get;set}
    Int UserId {get;set}
    DateTime DateTimeCreated {get;set;}
    

    GetDetailsView:这将由您的用户请求,并且将是 PostDetailsModel 的可视化表示(但是您希望对其进行格式化)。当请求此视图时,将调用您的控制器....

    PostDetailsController

    //This method will (by default) come from calling [BASEURL]/PostDetails/GetDetails
    public ActionResult GetDetails()
    {
        var details = new PostDetailsModel();
        details.UserId = GetUserId();
        details.ViewNumber = GetViewNumber();
        ....
        //By default this looks for a view in the PostDetails folder 
        //by the name of your method (GetDetails)
        return View(details);
    }
    

    注意控制器基本上是模型和视图之间的路由器。但是,请注意,最好从某种业务层中包含的方法填充您的模型(无论您如何实现它)。类似var details = BL.GetDetails();

    此外,当用户请求保存数据时,您可以使用另一种获取数据的方法(无论是 PostDetailsModel 还是 int 或...)并执行它需要做的任何事情,然后它可以重定向回显示操作(或您需要的任何地方)

    通过简单的 google 搜索,就有大量关于 MVC 的信息。 Here is Microsoft's overview,但是wikipedia article is very succinct if you just want the basics

    【讨论】:

      【解决方案2】:

      在 MVC 中,您的所有请求都将由控制器中的操作方法处理。然后控制器返回一个视图。因此,您可以在控制器(或将从控制器调用的不同层)中获取数据并将该数据传递给您的视图。

      强类型视图是一种简洁的做事方式。为您的场景创建一个 ViewModel。大多数情况下,ViewModel 看起来与实体相似。例如:为了显示有关客户的详细信息,我将创建一个名为“CustomerViewModel”的视图模型

      public class CustomerViewModel
      {
        public string CustomerId { set;get;}
        public string FirstName  { set;get;}
      }
      

      然后在我的 CustomerController 中,我将为客户提供一个 get 方法

      public class CustomersController : Controller
      {
        public ActionResult Details(int id)
        {
          CustomerViewModel objCustomer=new CustomerViewModel;
          objCustomer.FirstName="Samuel";
          //Instead of hardcoding the values here , you can get it
         // from the database using the id and assign to the properties
          return View(objCustomer);
        }
      
      
      }
      

      您的 Views\Customer 中将有一个名为“Details.chtml”的视图 强类型到您的 CustomerViewModel 的文件夹

      @model CustomerViewModel
      
      <div>
         <h2>@Model.FirstName</h2>
         <p>@Model.CustomerId</h2>
      </div>
      

      这可以像http://yourdomain.com/Customer/Details/25一样访问

      就我个人而言,我更喜欢让我的控制器动作保持精简。所以我在单独的服务层中编写 GetFromDatabase 代码,我只是从我的操作方法中调用该方法

      【讨论】:

        【解决方案3】:

        我认为您会发现这篇文章非常有用:

        MVC Overview

        它详细解释了每个组件的用途:

        模型。模型对象是应用程序中实现的部分 应用程序数据域的逻辑。通常,模型对象 在数据库中检索和存储模型状态。例如,一个产品 对象可能会从数据库中检索信息,对其进行操作,然后 然后将更新的信息写回 SQL Server 中的 Products 表。

        观看次数。视图是显示应用程序用户的组件 界面(UI)。通常,此 UI 是根据模型数据创建的。一个 示例将是显示文本的 Products 表的编辑视图 基于当前状态的框、下拉列表和复选框 一个 Products 对象。

        控制器。控制器是处理用户的组件 交互,与模型一起工作,并最终选择一个视图 显示 UI 的渲染。在 MVC 应用程序中,视图只显示 信息;控制器处理并响应用户输入和 相互作用。例如,控制器处理查询字符串值, 并将这些值传递给模型,模型依次查询 数据库使用值。

        【讨论】: