我喜欢使用辅助函数的想法,但我在设计方面有点挣扎。
我有一个可以将实体添加到列表框的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)。任何人的灵感?
答案 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。有时最简单的方法是最好的:)