C# 直接从Razor视图调用控制器操作方法

C# 直接从Razor视图调用控制器操作方法,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我环顾四周,找不到一个简单的解决办法 我尝试了@GetUserName,但无效。 我尝试了@{GetUserName,但不起作用 必须有一种简单的方法从razor视图引擎调用方法 它位于foreach循环中 我需要GetUserName(item.userID) 以下代码在我的控制器中: [ChildActionOnly] public string GetUserName(int userID) { ProPit_User user = db.ProPit_User.Find(use

我环顾四周,找不到一个简单的解决办法

我尝试了
@GetUserName
,但无效。
我尝试了
@{GetUserName
,但不起作用

必须有一种简单的方法从razor视图引擎调用方法

它位于
foreach
循环中

我需要
GetUserName(item.userID)

以下代码在我的控制器中:

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

     return user.username;
}

试图直接从视图中调用控制器操作方法通常是糟糕设计的标志

您有几个选项,具体取决于您尝试执行的操作:

  • 避免调用该方法,而是将数据放入模型中,然后渲染模型
  • 使用
  • 将该方法放在另一个类中,并使用普通函数语法
  • (1) 通常是我的默认方法,通常包括

    对于(3),例如

    以及以下观点:

    @Util.MyUtilMethod(1)
    
    尽管可以从视图中获取控制器实例,但这样做显然是错误的,因为它违反了整个MVC(和MVVM)范式,因为视图不应该知道它的控制器

    (我能想到的唯一有用的原因可能是从模拟视图测试控制器,尽管即使在这里,也可以直接从单元测试测试公开的控制器功能):


    获得此结果的更好方法是,控制器将
    视图所需的所有数据(如
    用户名
    )预填充到自定义
    视图模型
    (由页面顶部的
    @model
    指令键入),或到
    ViewBag
    dynamic。

    您是否尝试初始化对象以调用答案中提到的方法,我将重新考虑该设计。如果您仍然必须遵循该方法,您可以使用
    @Html.Action(“GetUserName”,“YourController”,new{userID=1})从视图调用子操作
    我会-1这个,但是我的鼠标靠近这个答案时会觉得脏。是的,它回答了OP的问题,即
    必须有一个简单的方法从razor视图引擎调用方法。
    ,但正如大家所说,这通常是一件疯狂的事情。每个人都应该很高兴我编写了一个单独的模型,现在它可以工作了正如我所希望的那样,通过模型传递所有信息。:@DanielGimenez相反,你可以指出错误并纠正它。这不像很多人已经知道答案了。。。
    @Util.MyUtilMethod(1)
    
    @{
        var controller = ViewContext.Controller as MyController;
        var userName = controller.GetUserName(123);
    }