2015-12-15 147 views
1

我已經讀了太多的教程已經沒有它解釋這意味着什麼動作結果爲什麼我需要將模型傳遞給視圖?

return View(model); 

爲什麼我們不能簡單的迴歸有何看法? 爲什麼我們要在我們的行動結果return view()中放置模型參數?

另外,任何人都可以舉一個例子,我必須使用return view(model)

+1

因爲視圖使用模型數據來呈現HTML代碼。 – Dennis

+0

您不必,但是如果您希望視圖使用模型屬性的值,那麼您必須將模型返回到視圖(其他方式將使用默認值) –

+0

MVC是Model View Controller模式。您需要將'Model'從'Controller'傳遞給'View'。有時候不需要傳遞'Model'來查看。但大多數你需要通過 – ebattulga

回答

7

因爲您的視圖使用模型來構建其內容。

如果你有這樣一個模型:

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背後的全部想法。視圖只知道模型,以及如何顯示模型 - 沒有別的。

控制器知道誰索要數據,而不是如何顯示

1

您可以簡單地返回視圖,但是當您將模型傳遞到視圖中時,可以在viewbag中使用它,並通過該視圖元素將模型數據綁定到視圖元素。

+0

你有任何示例代碼?我很難掌握這部分學習mvc – anaval

+0

View函數是一個常規函數,它返回ActionResult對象,它有幾個重載,其中一個不接受對象作爲參數。您可以簡單地轉到函數定義並探索所有可能的函數實現。 :) –

+0

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

1

您可以簡單地使用

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

您不需要對象傳遞給一個動作的結果,但如果你沒有,你不能訪問該模型。

即是很常見的做到這一點靜態頁面,例如關於屏幕:

公衆的ActionResult關於(){返回查看();}

而且,有可能通過其他物體而不是整個模型。 查看發表:Must ASP.NET MVC Controller Methods Return ActionResult?

4

你不需要。

如果你渲染視圖是靜態的,沒有從控制器所需的信息,然後你可以結束你行動return View();

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

然後在您.cshtml文件不申報任何@model指令它會沒事的。

1

在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

1

您可以只返回一個觀點:

View() 

在該視圖中,你贏了沒有一個@model你可以拿數據。您仍然可以通過ViewBagViewData向視圖發送一些動態數據。

是否可以在沒有模型的情況下進行查看?

一些情況:

  • 半靜態頁面:你並不需要一個模型,因爲幾乎將顯示在頁面的一切是靜態的。

  • 容器頁面:它可以包含很多partials視圖,javascript調用或任何你可以想象的用於檢索數據的東西。

  • 許多其他案件中,模型的存在不符合商業邏輯(或一個很好的實踐邏輯)

只要記住,顧客是我們提供指導,不給力我們只用一種方式來做事。檢查你的應用程序的最佳選擇,改變你不喜歡的位。儘量充分利用框架,但請記住它在那裏可以幫助你。

相關問題