【问题标题】:Helper functions - hoping for DRYness辅助函数 - 希望 DRYness
【发布时间】:2011-10-24 01:16:00
【问题描述】:

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

我有一个可以将实体添加到列表框的 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) });
}

这是令人讨厌的(不是干燥的)。启发任何人?

【问题讨论】:

  • 你应该调用.text,而不是.append(以避免XSS)

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


【解决方案1】:

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

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

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

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

在你使用辅助方法之前,一切都应该到位,当然它是 DRY 的。有时最简单的方法是最好的:)

【讨论】:

  • 是的......这是我的结论,但我曾希望从以前去过那里的人那里得到一个天神。这意味着我将不得不放弃我的辅助函数库并在 jQuery 中重新编码所有内容:(
猜你喜欢
  • 2014-01-23
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多