Общий шаблон частичного представления ASP.NET MVC - PullRequest
4 голосов
/ 16 февраля 2011

У меня есть частичное представление, что я хочу быть универсальным.Согласно этому вопросу частичные представления не могут быть общими.Поэтому я вместо этого сделал расширение HtmlHelper, которое обрабатывает фрагменты, для которых я хочу безопасность типов, а затем перевожу все остальное в реальное частичное представление.

Обычно мой помощник вызывается при загрузке страницы, что прекрасно работает, ноиногда я хочу добавить строку или что-то через AJAX.Когда это происходит, контроллер не может использовать мое «частичное представление», поскольку у него нет доступа к HtmlHelper.

Помимо частичного представления с моделью типа object, могу ли я что-либо сделать?

Я использую Razor, если это важно.

Упрощенная версия того, что я делаю:

public static MvcHtmlString DoStuff<T>(this HtmlHelper html, IEnumerable<T> data,
   Func<T, ViewModelType> StronglyTypedFn, string PartialName)
  {
  // the pre- and post-processing for the partial view is complex enough I'd like
  // to encapsulate it. But I want the encapsulation to include the safety 
  // benefits that generics give.
  var mappedData = data.Select(StronglyTypedFn);
  string htmlData = "";
  foreach(var model in mappedData){
    htmlData += html.Partial(PartialName, model);
  }
  htmlData += "some boilerplate footer html";
  return htmlData;
}

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

Теперь, при вызове ajax я хочу вернуть Html.DoStuff().Но я не могу, потому что для этого требуется доступ к HtmlHelper, а помощник недоступен внутри контроллера.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Вы можете использовать представление с динамическим типом вместо объекта.

Но ... Кажется, здесь есть какое-то недопонимание, потому что Контроллер вообще не должен пытаться визуализировать представление. Не могли бы вы опубликовать код контроллера?

Лучшим вариантом, IMO, является возвращение JsonResult для вашего запроса ajax и добавление строки / строк на стороне клиента с использованием JS.

0 голосов
/ 17 февраля 2011

Вы могли бы просто иметь простой метод действия, который вызывает партиал для одного экземпляра модели

public PartialViewResult Single(string partialName) {
    return PartialView(partialName);
}
...