RenderView与MVC2

时间:2010-01-10 19:46:26

标签: asp.net asp.net-mvc

我正在使用MVC预览2框架来开发网站,我正在关注MVCStorefront教程以获得对MVC的良好感觉。

你能告诉我为什么我不能使用RenderView()方法吗?

我错过了什么或者我可以使用View()吗? 这些方法之间有什么区别..

由于

这是Rob在他的教程中使用RenderView的地方。

[TestMethod]
    public void CatalogController_IndexMethod_ShouldReturn_Categories_And_Data_For_Parent1() {

        CatalogController c = new CatalogController(_repository);

        RenderViewResult result = (RenderViewResult)c.Index("Parent1", "Sub10");

        CatalogController.CatalogData data = (CatalogController.CatalogData)result.ViewData;

        Assert.IsNotNull(data.Category);
        Assert.IsNotNull(data.SubCategory);
        Assert.IsNotNull(data.SubCategory.Products);
        Assert.IsTrue(data.SubCategory.Products.Count() > 0);

        Assert.IsNotNull(result);
    }

我无法使用RenderView。它说“当前上下文中不存在名称'RenderView'

这是链接: http://www.asp.net/learn/mvc-videos/video-357.aspx

以下是CatalogController类的索引方法:

public ActionResult Index(string category, string subcategory) {

        //instantiate the service
        CatalogService svc = new CatalogService(_repository);

        //the ViewData class
        CatalogData data = new CatalogData();

        //pull all the categories for the navigation
        data.Categories = svc.GetCategories();

        //pull the category based on subcategory name
        data.Category = data.Categories.WithCategoryName(category);

        //catch for bad data
        if (data.Category == null) {

            data.Category = data.Categories.DefaultCategory();

            data.SubCategory = data.Category.SubCategories[0];

        } else {

            data.SubCategory = data.Categories.WithCategoryName(subcategory);

            //catch for bad SubCategory
            data.SubCategory= data.SubCategory ?? data.Category.SubCategories[0];

        }
        return RenderView("Index",data);
    }

我也遇到了在CatalogData类型中转换result.ViewData的问题,该类是包含数据的类。它说:无法将System.Web.Mvc.ViewDataDictionary类型转换为Commerce.MVC.Web.Controllers.CatalogController.CatalogData

2 个答案:

答案 0 :(得分:2)

您正在观看的视频很遗憾 - 它来自ASP.NET MVC 1.0 Preview 2.从那时起,ASP.NET MVC 1.0 RTM已发布,并且预览了ASP.NET MVC 2。

在ASP.NET MVC 1.0中,预览2及更早的操作方法返回'void',因此必须显式执行结果,例如渲染视图:

public void Index() {
    // do some work...
    RenderView("Index");
}

在ASP.NET MVC 1.0 Preview 3(Refresh?)和更新版本中,action方法返回一个结果对象,然后实际执行结果:

public ActionResult Index() {
    // do some work...
    return View("Index");
    // or you could also just say "return View();" and MVC figures out the view name
}

这种变化的主要原因是它允许更好的单元测试。 Action方法现在只执行“应用程序逻辑”,并且不用担心如何呈现视图。单元测试可以简单地检查应用程序逻辑的结果,然后验证下一个所需的步骤是“渲染视图”。

许多类型名称和方法名称也已更改,以使其更短且更易于使用。例如,RenderView只是View而RenderViewResult只是RenderView。

答案 1 :(得分:0)

如果我复活了这样一个死的主题,我很抱歉,但我遇到的问题与OP相同,我找到了解决办法。因此,如果任何关注Rob的StoreFront系列的人也会找到解决方案,我会在这里回复。

[TestMethod]
public void CatalogController_IndexMethod_ShouldReturn_Categories_And_Data_For_Parent1() {

    CatalogController c = new CatalogController(_repository);

    ViewResult result = c.Index("Parent1", "Sub10") as ViewResult;

    CatalogController.CatalogData data = result.ViewData.Model as CatalogController.CatalogData;

    Assert.IsNotNull(data.Category);
    Assert.IsNotNull(data.SubCategory);
    Assert.IsNotNull(data.SubCategory.Products);
    Assert.IsTrue(data.SubCategory.Products.Count() > 0);
    Assert.AreEqual("Parent1", data.Category.Name);
    Assert.AreEqual("Sub10", data.SubCategory.Name);

    Assert.IsNotNull(result);
}