ASP.NET MVC - код Response.Write - поместите его в Controller, SingleFile или CodeBehind - PullRequest
3 голосов
/ 05 февраля 2009

Если вы собираетесь генерировать страницу в виде строки и выводить весь контент через Response.Write в последнюю минуту, куда вы должны поместить этот код?

Мне нужно иметь возможность динамически писать клиенту связку JavaScript для использования некоторых новых визуализаций Google jsapi. Я заметил, что этот последний выпуск MVC-фреймворка «обескураживает» CodeBehinds для Views. Это действительно презентационный код. Куда это должно идти? Какой предпочтительный метод здесь ... Я никогда не был поклонником "SingleFile".

Ответы [ 2 ]

8 голосов
/ 05 февраля 2009

Вы также можете использовать ActionResult тип Content для возврата простой строки в браузер.

public ActionResult myAction() {
    Return Content("Hello World!");
}

Однако я не уверен, является ли это лучшим подходом при возврате JavaScript. Возможно, вы захотите написать свой собственный JavaScriptResult, который наследует ActionResult.

4 голосов
/ 05 февраля 2009

Код параметризуется? То есть вы можете контролировать различия между одним вызовом и другим с помощью небольшого набора параметров? Если так, то я бы подумал написать расширение HtmlHelper для его генерации. Тогда я бы использовал расширение в моем View для генерации кода. Передайте параметры в View через ViewData из контроллера, если вы не можете получить его из Model или RouteValues.

<%= Html.GenerateGoogleVisAPI( ViewData["someThing"],
                               ViewData["otherThing"] ) %>

Другой альтернативой может быть превращение его в ViewUserControl, в который можно передавать Model и ViewData. Вы все еще включили бы это через представление.

<% Html.RenderPartial( "GoogleVisControl",
                       ViewData["GoogleVisModel"],
                       ViewData ); %>

EDIT

Мои HtmlHelperExtensions обычно идут в отдельном проекте библиотеки классов. Таким образом, моя иерархия будет выглядеть примерно так: Обратите внимание, что для краткости я опускаю связанные тестовые проекты для каждого уровня, но они также будут там. Если у вас есть несколько приложений, использующих один и тот же уровень данных, уровень данных может существовать в отдельном решении, полностью в зависимости от того, есть ли у вас одно решение на приложение или несколько приложений на решение. Я добавляю ссылки на проекты в веб-проект для проектов библиотеки классов.

+-Project.Web
 +-Content
 +-Controllers
 +-Models
 +-Views
  +-...
  +-Shared
   +-Error.aspx
   +-GoogleVisControl.ascx
   +-LoginUserControl.ascx
   +-Site.Master
   +-...
  +-...
 +-...
+-Project.Common
+-Project.Common.Web
 +-HtmlHelperExtensions.cs
 +-...
+-Project.Data
 +...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...