【发布时间】: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