2015-11-04 96 views
1

我有一个已经运行了我的墙壁过去几天的一个错误。我有一些代码需要HttpContext和ViewResult并将视图呈现为字符串。此代码似乎工作得很好,直到我引入包含@ Html.RenderAction调用的视图。当调用的RenderAction添加到视图,我得到一个错误消息,指出绑在动作控制器需要一个无参数的构造函数。然而,添加这样的构造函数并不能改善这种情况。执行渲染代码如下:渲染一个ASP.Net MVC局部视图的字符串时,局部视图包含渲染动作

public static string Render(HttpContextBase httpContext, ViewResultBase partialViewResult) 
{ 
    var routeData = new RouteData(); 
    routeData.Values.Add("controller", "mock"); 

    var context = new ControllerContext(httpContext, routeData, new EmptyController()); 

    var view = partialViewResult.View; 
    if (view == null) 
    { 
     result = partialViewResult.ViewEngineCollection.FindPartialView(context, partialViewResult.ViewName); 

     view = result.View; 
    } 

    using (var sw = new StringWriter()) 
    { 
     var viewContext = new ViewContext(context, view, partialViewResult.ViewData, 
             partialViewResult.TempData, sw); 
     view.Render(viewContext, sw); 
     if (result != null) 
      result.ViewEngine.ReleaseView(context, view); 

     return sw.ToString(); 
    } 
} 

在我想要呈现的观点,我曾尝试:

@{ Html.RenderAction(FormController.Directive(Model.FormModel)); } 

@Html.Action(FormController.Directive(Model.FormModel)) 

两个结果在相同的错误消息。

An error occurred when trying to create a controller of type 'FormController'. Make sure that the controller has a parameterless public constructor. 

删除动作调用完全消除了错误消息。

控制器的操作是这样的:

public virtual ActionResult Directive(FormModel model) 
{ 
    model.MyProperty = "test"; 

    return View("FormView", model); 
} 

任何意见将不胜感激。

UPDATE

我跟踪这个问题有某种领带统一。渲染代码在我添加一个空构造函数并删除所有其他构造函数时起作用。其他构造函数包含对通过Unity路由的接口的引用。我需要更多地了解Unity。那里可能有一些功能正在替换或销毁我的控制器的默认构造函数。

回答

0

Html.Action声明看起来应该像下面这样:

@Html.Action("Directive", "Form", new { model = Model.FormModel }) 
+0

感谢您的提交,但这并没有解决问题。无参数构造函数错误依然存在。 – CodeMunkey

+0

你的'FormController'是否有一个类似于'public FormController(){...}'的构造函数。也许你可以在'FormController'类添加到你的问题,因为它看起来是这样的问题,而不是它的其余部分。 –

+0

我试图用一个公共的空构造使用控制器,或者甚至根本没有构造函数和误差保持不变。请记住,这里的问题以某种方式与尝试将视图呈现为字符串相关联。视图和控制器在使用IIS正常呈现时工作正常。 – CodeMunkey

0

/添加默认的构造函数到您的 “FormModel” 级,它会解决这个问题/

public void FormModel() 
    { 

    }