2012-12-04 79 views
2

有沒有什麼辦法可以讓強類型視圖的編譯時錯誤。比方說,我有一個觀點的文件夾中/Views/Home/Index.cshtml用下面的代碼&強類型型號:在ASP.Net中編譯錯誤模型的時間錯誤MVC

@model CSTemplate.Models.Home.HomeIndexModel 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

,然後控制器,位於/Controllers/HomeController.cs將返回下面的代碼。

public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      List<string> s = new List<string>(); 
      return View(s); 
     } 

    } 

正如你所看到的,因爲視圖()接受一個對象作爲模型,編譯器不會抱怨,該模型是無效的,並會輸出一個運行時錯誤,而不是,這就是:

Server Error in '/' Application. 

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[System.String]', but this dictionary requires a model item of type 'CSTemplate.Models.Home.HomeIndexModel'. 

有什麼辦法可以讓我編譯時錯誤,而不是運行時錯誤的情況下,這種模型類型不匹配,或有任何解決方法呢?

+0

如果你有ReSharper的安裝時它會通知你,如果類型不匹配 –

回答

1

從我們討論這個問題似乎沒有對這樣的情景沒有建議的解決方法內返回類型。由於視圖採用object類型的參數作爲參數,因此如果您錯誤地傳入與嚴格鍵入的View模型類型不同的模型,編譯器將不會投訴。可惜,因爲如果您需要更改View的嚴格類型模型的類型,編譯器將不會通知您以前傳遞給視圖的不一致模型,而只會在運行時通知這些錯誤。

+0

作爲一種想法 - 是否有可能嘗試調用每個動作的自動化測試,並且如果出現錯誤則會失敗?這不是一個編譯錯誤,但是如果你在編譯後自動運行測試,你將能夠在編譯後立即找到它。 – Bobson

+0

是的,這肯定是一個選項,某種形式的控制器操作的單元測試,以確保它們返回可接受的模型。 –

-1

return View(s);應的

CSTemplate.Models.Home.HomeIndexModel //this is the type model expecting 

List<string> //this is the type you are returning to the model 
+0

是的,這是我的問題,編譯器不抱怨,限制建築物如果視圖返回類型的東西'列表'而不是真正的嚴格類型的模型'CSTemplate.Models.Home.HomeIndexModel'。該項目成功構建,只會產生運行時錯誤。 –

+0

您可以將匿名類型傳遞給視圖並進行編譯。 – Kaf

+0

是的,我的問題是讓編譯器在模型類型不匹配的情況下發生抱怨,在視圖本身內嚴格鍵入的模型類型不匹配 –