2012-03-23 58 views
6

在MVC3應用,是它認爲是不好的做法,在.cshtml視圖中使用剃刀塊@{ }內部的try catch塊?試圖抓住不好的做法嗎?

+0

什麼在地球上? – SLaks 2012-03-23 19:31:50

+0

@SLaks - 正如你所說,這沒有什麼好的理由,而且在錯誤的地方會有邏輯 - 我還沒有完成它,但只是想來回一些。原因是我意識到我在關聯一個有一個有效的外部對象的視圖中有一個例外,但是這個外部對象已經從數據庫中刪除了。下面是一個關聯的例子:'phase.Container = containers.Where(cont => cont.ContainerId == phase.ContainerId).SingleOrDefault();'。我將不得不在這裏處理例外情況。是否所有的linq都被try catch包圍? – 2012-03-23 19:38:20

回答

12

非常如此。

意見不應包含任何真正的邏輯;任何可能引發異常的東西都屬於控制器。

+19

像這樣的一攬子聲明從來都不準確。您是否認爲將視圖中的任何代碼放在一個不好的形式?那麼爲什麼剃刀存在?如果在視圖中有代碼,肯定會出現需要處理異常(例如不可用的外部文件)的情況。 – Gullbyrd 2013-02-03 19:03:56

+1

如果它是共享的局部視圖並且沒有控制器,該怎麼辦? – 2014-01-28 20:06:46

+0

@MaksimVi .:然後您應該使用兒童動作。 – SLaks 2014-01-28 20:11:32

1

我會這麼說。最佳路徑將使模型在到達視圖之前傳遞給由控制器驗證的視圖。

2

嗯,你的使用取決於你的應用程序,但是你應該儘量保持你的意見,裸地的具體情況。理想情況下,代碼有效性將在控制器中進行驗證,並且永不傳遞給視圖。

2

不要把這樣的代碼視圖。視圖應儘可能只用於您的顯示標記。您可以將該嘗試捕獲放入控制器操作方法,該方法將數據提供給視圖。

public ActionResult GetUser(int id) 
{ 

    try 
    { 
    //Get the ViewModel and return the correct View. 
    } 
    catch(Exception ex) 
    { 
    //log the error 
    return View("YourErrorView"); 
    } 

} 

請記住,MVC強調的一點是關注點的分離。視圖應該是乾淨可讀的標記。

0

它不是做一件好事。 MVC框架旨在用邏輯來分離視圖。因此,在控制器中保持它應該在的位置。

1
@{ 
try 
{ 
    <td> 
     @((TradeType)Enum.Parse(typeof(TradeType), item.AppCode)).GetDescription(); 
    </td> 
} 
catch 
{ 
    <td>@item.AppCode 
    </td> 
} 
} 
+3

這個問題並非真正的答案:問題在於它是否是好的做法,而不是如何做。 – Stephen 2015-01-23 10:46:23

+0

雖然這可能會回答這個問題,但您並沒有留下任何解釋爲什麼這會起作用。這個答案不會爲可能有相同問題的後來訪問者增加太多價值。請擴大您的答案,包括一些解釋。 – 2015-01-23 10:51:00