【问题标题】:Calling controller action method directly from Razor View直接从 Razor View 调用控制器操作方法
【发布时间】:2014-04-03 16:14:44
【问题描述】:

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

我试过@GetUserName,但还是不行。
我试过 @ { GetUserName 还是不行。

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

它在foreach 循环内。

我需要GetUserName(item.userID)

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

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

     return user.username;
}

【问题讨论】:

  • 你试过初始化对象来调用方法吗
  • 如答案中所述,我会重新考虑该设计。如果您仍然必须遵循该方法,您可以使用 @Html.Action("GetUserName", "YourController", new { userID = 1 }) 从视图中调用子操作

标签: c# asp.net-mvc razor


【解决方案1】:

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

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

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

(1) 通常是我的默认方法,经常合并DisplayTemplates and EditorTemplates

对于(3),例如

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

还有观点:

@Util.MyUtilMethod(1)

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我会 -1 这个,但只要让我的鼠标靠近这个答案,我会觉得很脏。
    • 嗯,是的,它回答了 OP 的问题,即 There has to be an easy way to call a method from the razor view engine.,但正如大家所说,这通常是一件疯狂的事情。
    • 每个人都应该很高兴我写了一个单独的模型,现在它可以按照我的意愿工作,通过模型传递所有内容。 :)
    • @DanielGimenez 而不是你可以指出问题所在并纠正它。并不是很多人已经知道答案了……
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2014-09-08
    • 2020-12-28
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2020-10-13
    • 2013-10-05
    相关资源
    最近更新 更多