2013年8月8日星期四

[记录]js跨域调用mvc ActionResult扩展 - 狼性法则

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
[记录]js跨域调用mvc ActionResult扩展 - 狼性法则  阅读原文»

背景

  最近2个项目中都用到了js跨域访问的知识,2个项目都需要主站与各个分站之间进行数据交互、状态同步等相关操作。浏览器本身是不允许进行跨域访问,在MVC中我们可以扩展一个方法来实现这个功能。在此大家可以参考这两篇文章:http://www.cnblogs.com/lori/archive/2012/12/14/2817615.html,博问:http://q.cnblogs.com/q/53210/

代码实现

首先我们来写一个JsonpResult来扩展mvc本身自带的JsonResult,代码:

/// <summary>
/// 返回jsonp上下文
/// </summary>
public class JsonpResult : JsonResult
{
const string CALLBACKNAME = "jsonp";
/// <summary>
/// 复写渲染视图方法
/// </summary>
/// <param name="context"></param>
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("当前请求上下文出错");
}
if ((JsonRequestBehavior == JsonRequestBehavior.DenyGet)
&& String.Equals(context.HttpContext.Request.HttpMethod, "GET"))
{
throw new InvalidOperationException("Jsonp只能是GET请求");
}
var response = context.HttpContext.Response;
if (!String.IsNullOrEmpty(ContentType))
{
response.ContentType
= ContentType;
}
else
{
response.ContentType
= "application/json";
}
if (ContentEncoding != null)
{
response.ContentEncoding
= this.ContentEncoding;
}
if (Data != null)
{
String buffer;
var request = context.HttpContext.Request;
var serializer = new JavaScriptSerializer();
if (request[CALLBACKNAME] != null)
buffer
= String.Format("{0}({1})", request[CALLBACKNAME], serializer.Serialize(Data));
else
buffer
= serializer.Serialize(Data);
response.Write(buffer);
}
}
}

扩展完成以后我在mvc项目中编写了一个返回JsonpResult类型的action:

public JsonpResult Jsonp()
{
JsonpResult result
= new JsonpResult()
{
Data
= new { success =true, message ="调用成功"},
JsonRequestBehavior
= JsonRequestBehavior.AllowGet
};
return result;//反回一个jsonp(msg)对象
}

完成以后,新建一个mvc项目,通过js进行跨域访问,访问格式为:

<script type="text/javascript">
$(function () {
$.getJSON(
"http://localhost:8000/jsonp/Jsonp?jsonp=?", {}, function (data) {
alert(data.message);
});
})
</script>

程序运行,跨域调用成功:

下面试一下通过跨域传参数,看看是否能接收到:

分站js代码:

<script type="text/javascript">
$(function () {
$.getJSON("http://localhost:8000/jsonp/Jsonp?jsonp=?", {name:"northwolf"}, function (data) {
alert(data.message);
});
})
</script>

主站action代码:

public JsonpResult Jsonp(string name)
{
JsonpResult result
= new JsonpResult()
{
Data
= new { success =true, message ="接收到参数name="+name},
JsonRequestBehavior
= JsonRequestBehavior.AllowGet
};
return result;//反回一个jsonp(msg)对象
}

运行效果:

总结:

  跨域请求数据我们只需实现以上JsonpResult的扩展类型,同时在跨域请求的时候地址的时候加上jsonp=?比不可少的参数,即可实现改功能。


本文链接:http://www.cnblogs.com/flykai/p/3245209.html,转载请注明。

[转]一个小试验验证对象的指针计数置为nil的情况 - 小、  阅读原文»

本文转载于新风作浪的博客专栏,博客地址:http://blog.csdn.net/duxinfeng2010/article/details/8757211

以下博客原文:

最近遇到这样一个问题,以前的时候并未注意;新建一个工程,然后添加一个类,文件结构是这样的

然后写了这样一小段程序,运行

- (void)viewDidLoad
{
[super viewDidLoad];

Test
*testObj = [[Test alloc] init];
NSLog(
@"release 前 %d",[testObj retainCount]);
[testObj release];
NSLog(
@"release 后 %d",[testObj retainCount]);

}

明明release了,retainCount计数应该为0,但是 为什么retainCount计数还是1,当我们release操作两次的时候程序就崩溃了;

然后我们打印一下testObj对象

- (void)viewDidLoad
{
[super viewDidLoad];
Test
*testObj = [[Test alloc] init];
NSLog(
@"release 前 %d",[testObj retainCount]);
NSLog(
@"testObj release指向-->%@",testObj);
[testObj release];
NSLog(
@"release 后 %d",[testObj retainCount]);
NSLog(
@"testObj release指向-->%@",testObj);
}

发现他们指向同一块地址;

testObj 在alloc的时候在堆上申请到一片空间,然后它的retainCount计数为1,然后我们release之后,testObj指向的空间被销毁了,不存在了。此时testObj就是一个野指针了;此时我们调用[testObj retainCount]就属于一个不安全的做法;

然后我们在添加一行代码,[testObj release]之后,添加 testObj = nil;

- (void)viewDidLoad
{
[super viewDidLoad];

Test
*testObj = [[Test alloc] init];
NSLog(
@"release 前 %d",[testObj retainCount]);
NSLog(
@"testObj release指向-->%@",testObj);
[testObj release];
testObj
= nil;
NSLog(
@"release 后 %d",[testObj retainCount]);
NSLog(
@"testObj release指向-->%@",testObj);
}

唉,看到这里就应该明白了吧,[testObj release] 后,testObj仍有指向,只是testObj原来指向的那片空间已被销毁,但是本身还存在,通过置为nil这一步操作,就不在指向原来那片地址;应该记起viewDidUnload函数作用了吧,它就是干这个活的,我们申明一个对象属性的时候,在viewDidUnload中将这个属性置为nil这一步操作;

提醒:在ios6.0之后viewDidUnload这个方法已经弃用了,那么在哪里将属性置为nil哇,我现在是很纠结是否在dealloc释放和置属性为nil的。 不知道网友们是怎么做的

个人小结下:看这结果似乎是原对象释放,但是没有置为nil的时候原对象请求的空间因为有这个指针指着计数仍然为1,而只有在置为nil之后才会释放的样子。0.。0

不知道是不是这样子说。。


本文链接:http://www.cnblogs.com/ios-wmm/p/3247913.html,转载请注明。

阅读更多内容

没有评论:

发表评论