Вспомогательные функции - в надежде на сухость - PullRequest
1 голос
/ 24 октября 2011

Мне нравится идея использовать вспомогательную функцию, но я немного борюсь с дизайном.

У меня есть функция 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) });
}

что является вызывающим (не сухим). кто-нибудь вдохновляет?

1 Ответ

1 голос
/ 25 октября 2011

Вы правы в этом вопросе. Лично мне нравится СУХОЙ, но худшее, что я вижу в последней идее, которая вам совершенно справедливо не нравится, это то, что вы будете добавлять HTML в свой контроллер, что является принципиально плохой практикой, поскольку это работа ваших представлений.

Я думаю, что вспомогательные функции хороши, но, хотя они предназначены только на стороне сервера, они не являются подходящим инструментом для использования на стороне клиента.

Поэтому я бы переписал вашу функцию MyEntityAdd так:

function MyEntityAdd(o) {
    var productDisplay = '<strong>' + o.Product.Name + '</strong> ' + o.Version;
    var li = $('<li />').append(productDisplay);
    $('#SomeListbox').append(li);
}

И все должно встать на свои места, как это было до того, как вы использовали вспомогательный метод, и это, конечно, СУХОЙ. Иногда самые простые способы являются лучшими:)

...