2014-04-03 105 views
8

我環顧四周,無法找到簡單的解決方案。我試過@GetUserName哪個行不通。
我試過@ { GetUserName哪個不行。直接從Razor調用控制器操作方法查看

必須有一個簡單的方法來從剃鬚刀視圖引擎調用方法。

它在foreach循環內。

我需要GetUserName(item.userID)

下面的代碼是在我的控制器:

[ChildActionOnly] 
public string GetUserName(int userID) 
{ 
    ProPit_User user = db.ProPit_User.Find(userID); 

    return user.username; 
} 
+0

您是否嘗試過初始化對象以調用方法 –

+0

正如答案中所述,我會重新考慮該設計。如果你仍然需要遵循這種方法,你可以使用@ Html.Action(「GetUserName」,「YourController」,new {userID = 1})來調用視圖中的子操作。' –

回答

9

試圖直接調用控制器操作方法從您的視圖通常是設計不良的徵兆。

您有幾種選擇,這取決於你正在嘗試做的事:

  1. 避免調用的方法,而不是把數據放到你的模型,並渲染模型
  2. 使用Html.RenderAction
  3. 將該方法放在另一個類中,並使用正常的函數語法。

(1)通常是我的默認方法中,經常摻入DisplayTemplates and EditorTemplates

對於(3),例如

public static class Util 
{ 
    public string MyUtilMethod(int blah) 
} 

和視圖:

@Util.MyUtilMethod(1) 
0

你有明顯的問題是,該用戶名應該進來的模型,或者至少在ViewBag的一部分。

public ActionResult MyAction(int userID) { 
    ViewBag.UserName = db.ProPit_User.Find(userID).username; 

    return View(); 
} 

好的,但讓我們說一些瘋狂的原因,你當時沒有用戶ID。然後,您可以繼續並在控制器之外的類中使用該方法,並在視圖中創建一個實例。

@{ 
    var db = new Db(); 
    var userName = db.ProPit_User.Find(userID).username; 
} 
<div>userName is @userName</div> 

發生這種情況,但是您希望在您的模型中包含所有數據並將其發送到您的視圖。你的看法應該只是爲了顯示數據,並應該出去從數據庫中獲取信息。

+0

我在創建時擁有userid該模型。但是我不確定如何獲取用戶名。我將最新的帖子/帖子(兩個分開的桌子)中的5個放入列表。 ForumPost有用戶名,但我不能鏈接到我的用戶表來獲取用戶名。我不知道如何做到這一點。 –

+0

如果您創建模型並且具有用戶標識。爲模型添加一個用戶名屬性,並且至少執行以下操作:'foreach(myModel中的var x)x.UserName = db.ProPit_User.Find(x.userID).username;'。雖然我確定有更有效的方法來獲取用戶名,但至少可以工作。 –

+0

好吧,我將創建一個模擬ForumPost模型並添加一個UserName屬性的獨立模型。認爲我只是懶惰而正在尋找快速。 –

2

雖然你可以獲得從您的視圖控制器實例,這樣做是完全錯誤的,因爲它違背了整個MVC(和MVVM)模式,如認爲不應該知道它的控制器。我可以想到這將是有用的唯一可能的原因,可能是從模擬視圖測試控制器,雖然即使在這裏,也應該可以直接從單元測試測試暴露的控制器功能):?????????????

@{ 
    var controller = ViewContext.Controller as MyController; 
    var userName = controller.GetUserName(123); 
} 

的好辦法,這個結果已經抵達是控制器預填充,並pass全部由View所需要的數據,如userName,到自定義ViewModel(如同輸入由@model指令位於Razor頁面的頂部)或ViewBag動態。

+2

我會-1這個,但我會覺得髒只是讓我的鼠標接近這個答案。 –

+0

嗯,是的,它回答了OP的問題,即「必須有一種簡單的方法來從剃鬚刀視圖引擎中調用方法」,但正如大家所說,這通常是一個瘋狂的事情。 – StuartLC

+2

每個人都應該開心,我寫了一個單獨的模型,現在它可以按照我希望的方式在模型中傳遞所有內容。 :) –

0

其他答案說這是不好的做法;與大多數事情一樣,這取決於你如何使用它。

微軟的共享佈局爲MVC模板的一部分,_LoginPartial.cshtml直接調用視圖中的控制器上的SignInSignOut方法:使用超鏈接的asp-controllerasp-action標籤助手

<li><a asp-area="" asp-controller="Account" asp-action="Signin">Sign in</a></li> 

相關問題