我们可以从剃刀视图调用接口方法吗?

时间:2015-05-28 19:30:20

标签: c# asp.net-mvc razor

我必须调用一个在类中实现的方法。从剃刀看来有可能吗?

注意:我不想直接将该类暴露给视图

1 个答案:

答案 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()会正确输出“测试”。