Мне нравится идея использовать вспомогательную функцию, но я немного борюсь с дизайном.
У меня есть функция Javascript, которая может добавить объект в список - выглядит примерно так:
function MyEntityAdd(o) {
var li = $('<li />').append(o.Product.Name);
$('#SomeListbox').append(li);
}
... который вызывается двумя способами: 1) для отображения элементов при загрузке страницы:
$(function() {
@foreach (var item in Model) {
@: MyEntityAdd({ Product: { Name: '@item.Product.Name' }});
}
}
и, 2) для добавления элемента на существующую страницу, когда пользователь (посредством вызова ajax) создает новую сущность:
$.ajax({ type: 'post',
url: '/MyEntity/Create',
data: { ... },
success: function(o) {
MyEntityAdd(o)
}
});
Теперь моя проблема: мне нужно отформатировать продукт, и я выполняю его с помощью вспомогательной функции:
@helper FormatProduct(MyEntity e)
{
<strong>@e.Product.Name</strong> @e.Version
}
так что теперь я могу переопределить мои J следующим образом (параметр теперь плоский, а не объект со встроенными объектами):
function MyEntityAdd(o) {
var li = $('<li />').append(o.Product);
$('#SomeListbox').append(li);
}
позвонить так:
$(function() {
@foreach (var item in Model) {
@: MyEntityAdd({ Product: '@Html.FormatProduct(item.Product)' });
}
}
... все хорошо. За исключением того, что теперь вызов success
ajax не работает, потому что действие Create
возвращает объект JSON ... поэтому мне придется форматировать продукт внутри контроллера, т.е. вместо возврата:
[HttpPost]
public ActionResult Create(string Name)
{
MyEntity e = new MyEntity(Name);
db.MyEntities.Add(e);
db.SaveChanges();
return Json(e);
}
На этом конце мне также придется копировать функции форматирования:
[HttpPost]
public ActionResult Create(string Name)
{
MyEntity e = new MyEntity(Name);
db.MyEntities.Add(e);
db.SaveChanges();
return Json(new { Product = MyServerSideFormattingFunction(e) });
}
что является вызывающим (не сухим). кто-нибудь вдохновляет?