【问题标题】:Why do I need to pass a model to the view?为什么我需要将模型传递给视图?
【发布时间】:2016-03-20 19:50:19
【问题描述】:

我已经阅读了太多教程,但都没有解释这在操作结果中的含义

return View(model);

为什么我们不能简单的返回视图? 为什么我们要在我们的action result的return view()里放一个模型参数?

另外,任何人都可以举例说明我必须使用return view(model)的情况?

【问题讨论】:

  • 因为视图使用模型数据来渲染 HTML 代码。
  • 您不必这样做,但如果您希望视图使用模型属性的值,则必须将模型返回到视图(否则将使用默认值)跨度>
  • MVC 是模型视图控制器模式。您需要将ModelController 传递到View。有时无需通过Model 即可查看。但大多数情况下你需要通过

标签: c# asp.net-mvc


【解决方案1】:

您可以简单地返回视图,但是当您将模型传递给视图时,您可以将它用作您的视图包,并将视图元素与模型数据绑定。

【讨论】:

  • 你有示例代码吗?我在学习 mvc 时很难掌握这部分
  • View 函数是一个常规函数,它返回 ActionResult 对象,它有几个重载,其中一个不接受对象作为参数。您可以简单地转到函数定义并探索所有可能的函数实现。 :)
【解决方案2】:

因为您的视图使用模型来构建其内容。

如果你有这样的模型:

public class Order
{
    public decimal Total { get; set; }
}

还有你的控制器:

public ActionResult GetOrderInformation(int orderID)
{
    var order = LoadOrder(orderID);
    return View(order);
}

有了这个观点:

@model Order
<html>
    <head> </head>
    <body>
        Your order costs @Model.Total
    </body>
</html>

您可以看到视图是如何完全独立于控制器的,或者如何检索信息 - 这就是 MVC 背后的全部理念。视图只知道模型,以及如何显示模型 - 没有别的。

控制器知道向谁请求数据,但不知道如何显示它

【讨论】:

    【解决方案3】:

    你可以简单地使用

    return View();
    

    但是如果你需要绑定数据那么你必须像传递

    return View(model);
    

    举个例子 模型类

    public class BookViewModel
        {
            public Guid Id { get; set; }
            public string Name { get; set; }         
        }
    

    控制器方法

    public ActionResult Index()
    {
        return View();
    }
    public ActionResult Create()
    {
        return View(new BookViewModel());
    }
    

    查看

      @using (Html.BeginForm())
        {
            @Html.HiddenFor(m => m.Id)
            <div class="editor-label">
                @Html.LabelFor(m => m.Name)
            </div>
            <div class="editor-field">
                @Html.EditorFor(m => m.Name)
                @Html.ValidationMessageFor(m => m.Name)
            </div>
        }
    

    【讨论】:

      【解决方案4】:

      您不需要将对象传递给操作结果,但如果不这样做,您将无法访问模型。

      即在关于屏幕等静态页面上执行此操作很常见:

      public ActionResult About() {return View();}

      此外,可以传递其他对象而不是完整模型。 见帖子:Must ASP.NET MVC Controller Methods Return ActionResult?

      【讨论】:

        【解决方案5】:

        你不需要。

        如果您正在呈现的视图是静态的,并且不需要控制器提供任何信息,那么您可以使用 return View();

        结束您的 Action
        public ActionResult SomeAction()
        {
            ...
            return View();
        }
        

        然后在您的.cshtml 文件中不要声明任何@model 指令,这样就可以了。

        【讨论】:

          【解决方案6】:

          在 Asp.net MVC 中,View(chtml) 用于重新渲染 UI; 如果您的 View 是简单的或静态的,您可以在 View 中构建您的 html 内容而无需外部数据。

          如果您需要数据(来自 Db、Web 服务等),您的 View 必须能够查询数据源。

          有几种方法可以将数据传递给视图;通过 View(Model) 语句,通过 viewbag 等。

          我们还可以传递服务层对象,以便视图可以自己查询数据源。

          为什么我们需要再次将模型传递给视图?进入 View (cshtml) 后,您将无法访问 Controller -> 您可以通过准备好读取模型内的数据或服务层对象

          【讨论】:

          • "我们也可以传递服务层对象,这样视图可以自己查询数据源。" - 最佳实践会反对这种方法。视图应该能够在模型中显示数据,而不是如何检索数据。控制器负责确定如何为视图定义数据。
          • 有时 UI 组件确实需要访问服务层。例如。做服务器端分页、排序、分组(百万条记录)的网格组件
          • 例如看看DevExpress GridView组件如何处理大型数据库;他们将 IQueryable 存储在 MVC 模型中,因此他们的网格可以处理分页、排序、过滤等。documentation.devexpress.com/AspNet/14760/…
          【解决方案7】:

          你可以只返回一个视图:

          View()
          

          在该视图中,您将没有可以获取数据的@model。您仍然可以通过ViewBagViewData 向视图发送一些动态数据。

          是否可以有没有模型的视图?

          一些情况:

          • 半静态页面:您不需要模型,因为页面中显示的几乎所有内容都是静态的。

          • 容器页面:它可以包含许多局部视图、javascript 调用或任何您可以想象的动态检索数据的方法。

          • 模型的存在与业务逻辑(或良好实践逻辑)不对应的许多其他情况

          请记住,顾客的存在是为了指导我们,而不是强迫我们以一种方式做事。检查最适合您的应用程序的内容,更改您不喜欢的部分。尝试充分利用框架,但请记住它可以为您提供帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-07
            • 1970-01-01
            • 2011-03-14
            • 1970-01-01
            • 2020-03-12
            • 2012-03-28
            相关资源
            最近更新 更多