Helper函数——希望dry

Helper functions - hoping for DRYness

本文关键字:dry 希望 Helper 函数      更新时间:2023-09-26

我喜欢使用辅助函数的想法,但是我在设计上有点挣扎。

我有一个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
}

所以现在我可以像这样重新定义我的Js(参数现在是平面的,而不是一个嵌入对象的对象):

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) });
}

,这是eeky(不是DRY)。灵感吗?

你的质疑是对的。就我个人而言,我喜欢DRY,但我看到的最后一个想法中最糟糕的事情是,你将在你的控制器中添加HTML,这从根本上说是不好的做法,因为这是你的视图的工作。

我认为辅助函数是伟大的,但他们只是服务器端,他们不是正确的工具,为您的客户端使用。

所以我会重写你的MyEntityAdd函数为:

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

一切都应该像使用helper方法之前一样到位,当然它是DRY。有时候最简单的方法就是最好的。