Вопрос

Если я создаю PartialView для поля, содержащего заголовок, изображение и контент, каков наилучший способ хранения контента без использования базы данных?

Пример: TurboTax

Я сомневаюсь, что содержимое блоков на боковой панели хранится в базе данных, но для создания кода многократного использования было бы полезно создать структуру в PartialView и заполнить области содержимого. Я могу создать PartialView и передать модель из родительского контроллера в PartialView, но тогда я застряну, копируя и вставляя тот же контент, если я захочу использовать тот же блок на другой странице.

Это было полезно?

Решение

Для фиксированного содержимого вы можете подумать об использовании XML + XSLT или даже фрагментов HTML в файловой системе и просто их рендеринге. Метод HtmlHelper может иметь для этого больше смысла, чем частичное представление - Html.RenderXml () или Html.Include (). Единственная реальная разница между этими и частичными представлениями состоит в том, что механизм представления не вызывается, так как нет никаких замен. Я делаю такие вещи с моей политикой конфиденциальности и условиями. Я бы, конечно, подумал о том, чтобы сохранить их в кэше.

Если это действительно шаблоны, а вы просто заменяете контент, то я думаю, что частичное представление работает хорошо, и я бы снова подумал о том, чтобы поместить данные в базу данных, возможно, используя кеширование, если обнаружу, что производительность пострадала. Вы можете использовать это в сочетании с первым - скажем, храните ваши images / xml в файловой системе и указатель на них в базе данных, чтобы вы знали, какие из них выбрать в частичном.

Другие советы

Передача данных в частичное представление, которое используется во многих местах, может быть выполнена разными способами:

Создайте базовый класс модели для всех ваших моделей. В базовом классе определите свойство PartialModel, которое будет содержать модель для частичного просмотра (их может быть много, если использование имеет много частичных представлений). Теперь вы можете заполнить свойство PartialModel в действии контроллера, но чтобы сделать код более пригодным для повторного использования, вы можете создать собственный фильтр действий, который будет вставлять данные частичного представления сразу после выполнения метода действия (но до того, как модель будет передана в представление)

public class PartialViewModelAttribute : ActionFilterAttribute
{
  public override void OnActionExecuted(ActionExecutedContext filterContext)
  {
     BaseViewModel model;

     if (filterContext.Controller.ViewData.Model == null)
     {
          model = new BaseViewModel();
          filterContext.Controller.ViewData.Model = model;
     }
     else
     {
        model = filterContext.Controller.ViewData.Model as BaseViewModel;
     }

     model.PartialModel = new PartialModel(...)   // Partial model initialization
     base.OnActionExecuted(filterContext);
  }
}

Тогда вы можете использовать его следующим образом:

[PartialViewModel]
public ActionResult Index()
{
  //...
}

Другой вариант: вы можете создать класс BaseController для всех ваших контроллеров и создать PartialModel при инициализации базового контроллера. Затем PartialModel можно сохранить в словаре ViewData []. Поскольку использование словаря ViewData в представлениях плохо, создайте метод расширения в HtmlHelper, например:

public static PartialModel GetPartialModel(this HtmlHelper helper)
{
   return helper.viewContext.ViewData["PartialModel"] as PartialModel
}

Таким образом, вы можете получить модель следующим образом:

<% Html.RenderPartial("MyPartial", Html.GetPartialModel()); %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top