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

时间:2014-04-03 16:14:44

标签: c# asp.net-mvc razor

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

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

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

它在foreach循环内。

我需要GetUserName(item.userID)

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

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

     return user.username;
}

3 个答案:

答案 0 :(得分:13)

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

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

  1. 避免调用方法,而是将数据放入模型中,然后渲染模型
  2. 使用Html.RenderAction
  3. 将该方法放在另一个类中,并使用普通函数语法。
  4. (1)通常是我的默认方法,通常包含DisplayTemplates and EditorTemplates

    对于(3),例如

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

    观点:

    @Util.MyUtilMethod(1)
    

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:-3)

其他答案说这是不好的做法;与大多数事情一样,这取决于您如何使用它。

Microsoft的共享布局作为MVC模板的一部分,_LoginPartial.cshtml直接从视图调用控制器上的SignInSignOut方法:

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

在超链接上使用asp-controllerasp-action标记帮助程序。

相关问题