我必须调用一个在类中实现的方法。从剃刀看来有可能吗?
注意:我不想直接将该类暴露给视图
答案 0 :(得分:1)
是的,您可以将Razor模型绑定到接口(尽管您必须在某处注入具体实例,通常是您的控制器)。
public ActionResult Index()
{
IList<string> list = new List<string> {"one", "two"};
return View(list);
}
Razor观点:
@model IList<string>
@{ Model.RemoveAt(0); }
在这个简单的测试用例中,RemoveAt()
接口保证IList<T>
,这意味着底层具体实现尚未暴露给视图。
另一个例子是自定义实现,其中一个具体类的公共方法由接口保证,另一个不是:
public class Test : ITest
{
public int Id { get; set; }
public string Name { get; set; }
public string GetName()
{
return Name;
}
public int GetId()
{
return Id;
}
}
public interface ITest
{
string GetName();
}
控制器:
public ActionResult Index()
{
var test = new Test() {Id = 1, Name = "Test"};
return View(test);
}
Razor查看:
@model ITest
@(Model.GetId())
在这种情况下,{Razor视图中的GetId()
将以红色突出显示为无效语法,您将在运行时收到以下编译错误。
ITest'不包含'GetId'的定义
另一方面,Model.GetName()
会正确输出“测试”。