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

本文关键字:调用 控制器 操作方法 视图 Razor | 更新日期: 2023-09-27 17:56:22

我环顾四周,找不到简单的解决方案。

我已经尝试了@GetUserName不起作用。
我已经尝试了@ { GetUserName不起作用。

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

它位于foreach循环内。

我需要GetUserName(item.userID)

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

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

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

尝试直接从视图调用控制器操作方法通常是设计不佳的标志。

您有几个选择,具体取决于您要执行的操作:

  1. 避免调用该方法,而是将数据放入模型中,并呈现模型
  2. 使用 Html.RenderAction
  3. 将该方法放在另一个类中,并使用正常的函数语法。

(1)通常是我的默认方法,通常包含显示模板和编辑器模板

对于 (3),例如

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

和观点:

@Util.MyUtilMethod(1)

尽管您可以从视图中获取控制器实例,但这样做是完全错误的,因为它违反了整个 MVC(和 MVVM)范例,因为视图不应知道其控制器。

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

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

获得此结果的更好方法是让控制器预填充,并将View所需的所有数据(例如userName)传递给自定义ViewModel(由 Razor 页面顶部的 @model 指令键入)或ViewBag动态。