Asp.net mvc 2 具有接口类型的Asp.NETMVC模板帮助程序

Asp.net mvc 2 具有接口类型的Asp.NETMVC模板帮助程序,asp.net-mvc-2,asp.net-mvc-3,Asp.net Mvc 2,Asp.net Mvc 3,我想使用Asp.net MVC模板帮助功能在整个应用程序中为我的对象生成标准UI,但我遇到了一个重大问题: 我不会直接将类类型从控制器传递到它们的视图中。相反,我传递接口类型。。在间接引用的项目中,模型的实际实现封装在Mongo或NHibernate特定的类中 为了便于讨论,我的对象如下所示: public interface IProductRepository { IProduct GetByName(string name); } public interface IProduc

我想使用Asp.net MVC模板帮助功能在整个应用程序中为我的对象生成标准UI,但我遇到了一个重大问题:

我不会直接将类类型从控制器传递到它们的视图中。相反,我传递接口类型。。在间接引用的项目中,模型的实际实现封装在Mongo或NHibernate特定的类中

为了便于讨论,我的对象如下所示:

public interface IProductRepository {
    IProduct GetByName(string name);
}

public interface IProduct { 
    string Name { get; set; }
}

public class NHibernateProductRepository : IProductRepository {
    public IProduct GetByName(string name) { 
       /* NHibernate Magic here */
       return nhibernateFoundProduct;
    }
}

public class NHibernateProduct : IProduct {
    public virtual Name { get; set; }
}

public class ProductController : Controller {

    public ProductController(IProductRepository productRepo) {
       _ProductRepo = productRepo;
    }

    public ActionResult Index(string name) {
        IProduct product = _ProductRepo.GetByName(name);
        return View(product);
    }

}
是否可以将接口类型与Editor.For()语法一起使用?是否有任何问题或症结需要我注意


我有一个EditorTemplate\ipproduct.ascx文件可用。此时,如果不将“ipproduct”名称硬编码到Editor.For()调用中,我似乎无法呈现该模板。我更喜欢这种类型的“约定优于配置”…

模板帮助程序将使用对象的运行时类型作为名称。在这种情况下,您应该将文件命名为NHibernateProduct.ascx


如果您在设计时不知道类型的名称,那么您可以编写一个helper方法来检查对象实例,遍历特定类型正在实现的接口列表,并根据该列表返回名称。然后,您将调用适当的重写以获取字符串“templateName”参数的
EditorFor

我决定使用实现IPProduct接口的Web项目固有的ViewModel方法。

是。。。。这是行不通的,因为传递给视图的IPProduct的具体类型是未知的。