Asp.Net Mvc使用接口类型模板化助手

时间:2011-02-21 15:04:38

标签: asp.net-mvc-2 asp.net-mvc-3

我想使用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 \ IProduct.ascx文件。此时,我似乎无法在不将“IProduct”名称硬编码到Editor.For()调用中的情况下呈现该模板。我更喜欢这种“约定优于配置”......

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我决定使用一种方法,将ViewModel原生于实现IProduct接口的Web项目。