2015-11-04 3 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() 
    { 

    } 
0

Как комментировали ранее ошибка связана с нашим использованием Unity IOC. Похоже, что это известная проблема с MVC при использовании контроллеров с зависимостями. Существует предлагаемое исправление CodeProject: http://www.codeproject.com/Articles/99361/How-To-Use-Unity-Container-In-ASP-NET-MVC-Framewor

Я попробую это и надеюсь, что он исправляет проблему для нас.

Смежные вопросы