为什么我需要将模型传递给视图?

问题描述:

我已经读了太多的教程已经没有它解释这意味着什么动作结果为什么我需要将模型传递给视图?

return View(model); 

为什么我们不能简单的回归有何看法? 为什么我们要在我们的行动结果return view()中放置模型参数?

另外,任何人都可以举一个例子,我必须使用return view(model)

+1

因为视图使用模型数据来呈现HTML代码。 – Dennis

+0

您不必,但是如果您希望视图使用模型属性的值,那么您必须将模型返回到视图(其他方式将使用默认值) –

+0

MVC是Model View Controller模式。您需要将'Model'从'Controller'传递给'View'。有时候不需要传递'Model'来查看。但大多数你需要通过 – ebattulga

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

如果你有这样一个模型:

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背后的全部想法。视图只知道模型,以及如何显示模型 - 没有别的。

控制器知道谁索要数据,而不是如何显示

您可以简单地返回视图,但是当您将模型传递到视图中时,可以在viewbag中使用它,并通过该视图元素将模型数据绑定到视图元素。

+0

你有任何示例代码?我很难掌握这部分学习mvc – anaval

+0

View函数是一个常规函数,它返回ActionResult对象,它有几个重载,其中一个不接受对象作为参数。您可以简单地转到函数定义并探索所有可能的函数实现。 :) –

+0

https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.view(v=vs.118).aspx –

您可以简单地使用

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

您不需要对象传递给一个动作的结果,但如果你没有,你不能访问该模型。

即是很常见的做到这一点静态页面,例如关于屏幕:

公众的ActionResult关于(){返回查看();}

而且,有可能通过其他物体而不是整个模型。 查看发表:Must ASP.NET MVC Controller Methods Return ActionResult?

你不需要。

如果你渲染视图是静态的,没有从控制器所需的信息,然后你可以结束你行动return View();

public ActionResult SomeAction() 
{ 
    ... 
    return View(); 
} 

然后在您.cshtml文件不申报任何@model指令它会没事的。

在Asp.net MVC中,View(chtml)用于UI的重写; 如果你的View是简单或静态的,你可以在View中构造你的html内容而不需要外部数据。

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

有几种方法可以传递数据来查看;通过视图(模型)语句,通过视图包等。

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

为什么我们需要再次将模型传递给View?一旦视图(CSHTML)您无法访问控制器 - >您可以通过随时阅读您的模型中的数据或服务层对象

+0

“我们还可以传递服务层对象,使查看可以查询数据源本身“。 - 最佳实践会说与这种方法背道而驰。该视图应该能够在模型中显示数据,而不是如何检索数据。确定如何为视图定义数据是控制器的责任。 –

+0

有时UI组件确实需要访问服务层。例如。网格组件做服务器端分页,排序,分组(百万条记录) – kite

+0

例如看看DevExpress GridView组件如何处理大型数据库;他们将IQueryable存储在MVC模型中,因此他们的网格可以处理分页,排序,过滤等。https://documentation.devexpress.com/AspNet/14760/ASP-NET-MVC-Extensions/Grid-View/Concepts/Binding -to-数据/绑定到大型数据数据库 - 服务器模式 – kite

您可以只返回一个观点:

View() 

在该视图中,你赢了没有一个@model你可以拿数据。您仍然可以通过ViewBagViewData向视图发送一些动态数据。

是否可以在没有模型的情况下进行查看?

一些情况:

  • 半静态页面:你并不需要一个模型,因为几乎将显示在页面的一切是静态的。

  • 容器页面:它可以包含很多partials视图,javascript调用或任何你可以想象的用于检索数据的东西。

  • 许多其他案件中,模型的存在不符合商业逻辑(或一个很好的实践逻辑)

只要记住,顾客是我们提供指导,不给力我们只用一种方式来做事。检查你的应用程序的最佳选择,改变你不喜欢的位。尽量充分利用框架,但请记住它在那里可以帮助你。