我正在使用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
答案 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);
}