辅助功能 - 希望干燥

时间:2011-10-24 01:16:00

标签: javascript asp.net-mvc razor html-helper

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

我有一个可以将实体添加到列表框的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)。任何人的灵感?

1 个答案:

答案 0 :(得分:1)

你对此提出质疑是正确的。就我个人而言,我喜欢DRY,但是我看到你最不喜欢的最后一个想法最糟糕的是你将在你的Controller中添加HTML,这实际上是不好的做法,因为这是你的观点的工作。

我认为辅助功能很棒但是它们只是服务器端,它们不是客户端使用的正确工具。

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

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

一切都应该在您使用辅助方法之前就已经存在,当然它是DRY。有时最简单的方法是最好的:)