我需要一些建议,以便在开发嵌入式小部件时使用最佳方法,我的网站用户可以使用这些小部件在其网站上显示我们的内容。
假设我们有一些内容使用jQuery插件进行渲染,我们希望为客户提供一种将其嵌入其网站的简便方法。
一种选择可能是使用IFrame,但我们知道这是非常具有侵略性并且存在一些问题。我也想知道你对此的看法。
另一种方法可能是给出这样的代码,以显示第23项:
<DIV id="mysitewidget23"><script src="http://example.com/scripts/wdg.js?id=23" /></DIV>
并以某种方式(需要帮助......)创建wdg.js服务器端脚本以在DIV中注入内容,jQuery,所需的插件。
这看起来更有前景,因为用户可以在一定程度上自定义DIV的样式,并且不需要IFRAME。但是哪种方法是在ASP.NET MVC中执行此操作的最佳且更有效的方法?
当然还有许多其他方法可以实现我们的需要。
答案 0 :(得分:12)
JSONP是一种方法。首先编写一个自定义ActionResult,它将返回JSONP而不是JSON,这将允许您解决跨域Ajax限制:
public class JsonpResult : JsonResult
{
public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
if (!string.IsNullOrEmpty(ContentType))
{
response.ContentType = ContentType;
}
else
{
response.ContentType = "application/json";
}
if (ContentEncoding != null)
{
response.ContentEncoding = ContentEncoding;
}
if (Data != null)
{
var request = context.HttpContext.Request;
var serializer = new JavaScriptSerializer();
if (null != request.Params["jsoncallback"])
{
response.Write(string.Format("{0}({1})",
request.Params["jsoncallback"],
serializer.Serialize(Data)));
}
else
{
response.Write(serializer.Serialize(Data));
}
}
}
}
然后你可以编写一个返回JSONP的控制器动作:
public ActionResult SomeAction()
{
return new JsonpResult
{
Data = new { Widget = "some partial html for the widget" }
};
}
最后人们可以使用jQuery在他们的网站上调用此操作:
$.getJSON('http://www.yoursite.com/controller/someaction?jsoncallback=?',
function(json)
{
$('#someContainer').html(json.Widget);
}
);
如果用户不想在他们的网站上包含jQuery,您可以在您的网站上编写包含jQuery并执行之前的getJSON调用的JavaScript代码,这样人们只需要包含来自网站的单个JavaScript文件在你的例子中。
更新:
正如评论部分所述,这是一个示例,说明如何从脚本动态加载jQuery。只需将以下内容放入JavaScript文件中即可:
var jQueryScriptOutputted = false;
function initJQuery() {
if (typeof(jQuery) == 'undefined') {
if (!jQueryScriptOutputted) {
jQueryScriptOutputted = true;
document.write("<scr" + "ipt type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js\"></scr" + "ipt>");
}
setTimeout("initJQuery()", 50);
} else {
$(function() {
$.getJSON('http://www.yoursite.com/controller/someaction?jsoncallback=?',
function(json) {
// Of course someContainer might not exist
// so you should create it before trying to set
// its content
$('#someContainer').html(json.Widget);
}
);
});
}
}
initJQuery();