我环顾四周,找不到一个简单的解决方案。
我尝试了@GetUserName
这不起作用
我已经尝试了@ { GetUserName
这不起作用。
必须有一种从剃刀视图引擎调用方法的简单方法。
它在foreach
循环内。
我需要GetUserName(item.userID)
以下代码在我的控制器中:
[ChildActionOnly]
public string GetUserName(int userID)
{
ProPit_User user = db.ProPit_User.Find(userID);
return user.username;
}
答案 0 :(得分:13)
尝试直接从视图中调用控制器操作方法通常是设计不良的标志。
您有几个选择,具体取决于您要执行的操作:
(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
直接从视图调用控制器上的SignIn
和SignOut
方法:
<li><a asp-area="" asp-controller="Account" asp-action="Signin">Sign in</a></li>
在超链接上使用asp-controller
和asp-action
标记帮助程序。