写点东西来吐槽一下自己,真是无语了。
2014-12-02 22:01
309 查看
首先,写这篇博文的目的是给未来自己看的,希望以后每天都读一下,这样就不会犯错误了。
前两天,在开发项目的时候,写一个功能,就是使用 Ajax 异步加载一些信息,这个在平常开发过程中,我们一般都会遇到,在 Controller 中写一个异步 Action 方法,使用 HttpGet 或 HttpPost,然后在方法中处理一些操作,最后返回拼接的 Html 字符串,View 中的操作就是写一个 Ajax 脚本进行调用,贴一点示例代码:
Controller 中的 Action 方法:
View 中的 Ajax 脚本:
什么问题呢?就是我不管怎么调试,最后 div_id 中填充的 data 始终是字符串格式,也就是没有转换的 html 格式,说实话,这个问题,我当时“挣扎”了很久,我以为是 Controller 中的 Action 只能返回格式化的字符串,然后就各种搜索关键字,花了很长时间,最后也没有一个结果,因为是通过 Ajax 脚本填充的,不是通过 ViewData 之类的东西传递,所以你不能直接使用 View 中的 Html.Raw() 进行 Html 格式转换,所以转换操作必须在 Action 方法中,但关键是,没有这之类的解决方式,这个问题,大概花了我几个小时的时候,我隐约记得之前这样写的方式是没问题的,为此我有查看了下之前项目中相类似的代码,确实没什么问题,为此我更郁闷了。。。
哎,往事不堪回首,最后发现,原因出在我“复制粘贴”的 Html 字符串上,不知道为什么,我是使用浏览器的查看元素功能,然后复制现有的 Html 代码,拷贝在 VS2015 中,当时没怎么注意,你可以仔细看下 GetAjaxInfo 中的 Html 字符,会发现中间莫名多了一个“空格”,哎,哎,哎,当我发现是这个问题的时候,我的第一想法是:窗户在哪里???我要跳下去。
Controller 中的 Action 方法:
View 代码
上面是我后来的测试代码,可能有些乱,但写出来都是有原因的,这一次我钻什么“洞”了呢?答案是:async 的 Action 只能给 ViewData 赋值,然后 JS 脚本才能访问到。听起来可能有点晕,为什么我会这样认为呢?因为之前我写类似的代码,ViewData["data"] 是通过 await 获取访问到的数据,而今天我写的 Action 方法,ViewData["data"] 是同步赋值的,但这种写法就不行,所以我把“嫌疑”放在了它身上,然后有去搜索“async Action ViewData”之类的关键词,但却没搜到什么有“价值”的东西,现在想想,能搜到的话,就真的奇怪了,为了重现这个“问题”,我又搞了个测试项目进行操作,最后发现同步赋值的 JS 也不能访问了,当时做到这,真是要死的感觉,然后花了两个小时进行再思考,没办法,一点头绪都没有,然后肚子饿了,下班吃东西,在路上,以至于吃饭的时候,我都在思考这个问题,在想到底是哪方面出了问题?最后,还是一点头绪都没有。
回到住的地方,倒了杯茶,然后再“思考”,不知道抽了什么筋,把 alert(@ViewData["data"]) 改成 alert("@ViewData["data"]"),你猜怎么着???居然访问到了,我的天哪???自己到底是有多”二“啊,哎!
总结下自己写代码的方式,或者是寻找解决问题的方式:
一定要细心。
反复 CodeReview 自己写的代码,不要过于“相信”自己。
如果陷在一个问题,试着跳出这个问题,散散步,或者喝一杯茶,也许就会发现问题所在了。
谨记谨记。。。
前两天,在开发项目的时候,写一个功能,就是使用 Ajax 异步加载一些信息,这个在平常开发过程中,我们一般都会遇到,在 Controller 中写一个异步 Action 方法,使用 HttpGet 或 HttpPost,然后在方法中处理一些操作,最后返回拼接的 Html 字符串,View 中的操作就是写一个 Ajax 脚本进行调用,贴一点示例代码:
Controller 中的 Action 方法:
public class CommonAjaxController : Controller { [HttpGet] public async Task<ContentResult> GetAjaxInfo(int para) { var item = await .......GetInfo(para); StringBuilder resultHtml = new StringBuilder(); foreach (var item in news) { resultHtml.Append("< li >< a href = \"/n/\{item.Url}/\" target = \"_blank\" >\{item.Title}< / a > < / li >"); } return Content(resultHtml.ToString()); } }
View 中的 Ajax 脚本:
$(function () { $.ajax({ url: '/CommonAjax/GetAjaxInfo', type: 'GET', datatype: "json", contentType: "application/json; charset=utf-8", data: { para: para }, success: function (data) { if (data) { $("#div_id").html(data); } } }); });
什么问题呢?就是我不管怎么调试,最后 div_id 中填充的 data 始终是字符串格式,也就是没有转换的 html 格式,说实话,这个问题,我当时“挣扎”了很久,我以为是 Controller 中的 Action 只能返回格式化的字符串,然后就各种搜索关键字,花了很长时间,最后也没有一个结果,因为是通过 Ajax 脚本填充的,不是通过 ViewData 之类的东西传递,所以你不能直接使用 View 中的 Html.Raw() 进行 Html 格式转换,所以转换操作必须在 Action 方法中,但关键是,没有这之类的解决方式,这个问题,大概花了我几个小时的时候,我隐约记得之前这样写的方式是没问题的,为此我有查看了下之前项目中相类似的代码,确实没什么问题,为此我更郁闷了。。。
哎,往事不堪回首,最后发现,原因出在我“复制粘贴”的 Html 字符串上,不知道为什么,我是使用浏览器的查看元素功能,然后复制现有的 Html 代码,拷贝在 VS2015 中,当时没怎么注意,你可以仔细看下 GetAjaxInfo 中的 Html 字符,会发现中间莫名多了一个“空格”,哎,哎,哎,当我发现是这个问题的时候,我的第一想法是:窗户在哪里???我要跳下去。
当然,一个问题场景证明不了自己有多“二”,就在今天,又是类似的问题,哎!
我使用 ASP.NET 5,在 Action 中给 ViewData 赋一个值,然后在 View 中进行展示,Html 中访问 ViewData 没有什么问题,但是当我在 JS 脚本中访问,就出现了问题,示例代码:Controller 中的 Action 方法:
public async Task<IActionResult> About() { using (var context=new BloggingContext()) { ViewData["data"] = await context.Blogs.FirstOrDefaultAsync(); } //ViewData["data"] = await Task<string>.Run(() => { return "data"; }); //ViewData["data"] = "data"; ViewBag.Message = "Your application description page. XISHUAI"; return View(); }
View 代码
@{ ViewBag.Title = "About"; } <h2>@ViewBag.Title.</h2> <h3>@ViewBag.Message</h3> <h1>@ViewData["data"]</h1> <p>Use this area to provide additional information.</p> <script type="text/javascript"> alert(@ViewData["data"]) window.onload = function () { alert(@ViewData["data"]); } </script>
上面是我后来的测试代码,可能有些乱,但写出来都是有原因的,这一次我钻什么“洞”了呢?答案是:async 的 Action 只能给 ViewData 赋值,然后 JS 脚本才能访问到。听起来可能有点晕,为什么我会这样认为呢?因为之前我写类似的代码,ViewData["data"] 是通过 await 获取访问到的数据,而今天我写的 Action 方法,ViewData["data"] 是同步赋值的,但这种写法就不行,所以我把“嫌疑”放在了它身上,然后有去搜索“async Action ViewData”之类的关键词,但却没搜到什么有“价值”的东西,现在想想,能搜到的话,就真的奇怪了,为了重现这个“问题”,我又搞了个测试项目进行操作,最后发现同步赋值的 JS 也不能访问了,当时做到这,真是要死的感觉,然后花了两个小时进行再思考,没办法,一点头绪都没有,然后肚子饿了,下班吃东西,在路上,以至于吃饭的时候,我都在思考这个问题,在想到底是哪方面出了问题?最后,还是一点头绪都没有。
回到住的地方,倒了杯茶,然后再“思考”,不知道抽了什么筋,把 alert(@ViewData["data"]) 改成 alert("@ViewData["data"]"),你猜怎么着???居然访问到了,我的天哪???自己到底是有多”二“啊,哎!
总结下自己写代码的方式,或者是寻找解决问题的方式:
一定要细心。
反复 CodeReview 自己写的代码,不要过于“相信”自己。
如果陷在一个问题,试着跳出这个问题,散散步,或者喝一杯茶,也许就会发现问题所在了。
谨记谨记。。。
相关文章推荐
- 只学一点点:我的技术学习策略(虽然不赞同,但可以参考一下,针对不常用的技术可以这样,同时可以:寻找遁去的一,不用管别人怎么想;有学习的时间,不如自己写、自己实践,否则学完了都不知道是什么东西)
- 在做mes系统时,利用D7 IdMessage&IdSMTP发送邮件,从盒子上学习了不少的东西,自己整理了一下,想share给新手,学习参考!
- 开始写点东西,记录一下自己学习 .net
- 方便与IOS开发的宏定义----别人的东西,自己记录一下
- Spring Security教程外篇(2)---- 乱起八糟的一下东西,自己备用
- 激励一下自己,应该学习哪些东西
- 从别处找到的有关web打印的东西,自己用了一下,还真不错,解决我的大问题了
- 吐槽面试经历,最后成功拿到4个offer,很受用--看完之后说一下自己的看法吧
- 理解I/O Completion Port(先转帖一下吧,其实很多东西有自己的讲解,以后再更新)
- 心绪不宁的时候就该写点东西,审视一下自己的内心吧
- Spring Security教程外篇(2)---- 乱起八糟的一下东西,自己备用
- Spring Security教程外篇(2)---- 乱起八糟的一下东西,自己备用
- 其实我真是觉得我应该写一篇总结来总结一下自己的生活的了
- 心里有点空,写点东西鼓励一下自己
- 鼓励一下自己:也许越到后来,水平越高,学东西更快,所以不必觉得累,觉得学不完。而且高手本来就应该见多识广,多看项目(没时间做很多项目,看总是应该的吧)
- 转贴一篇文章---发泄一下自己的不满
- 第一次建立自己的blog,测试一下先:)
- 初学习cocos2d小结(感冒了,几行代码都记不住...稍微复杂一点的动作序列看不下去,还是总结一下这两天看的东西)
- Ubuntu 自己用的一些东西
- 今天说一下 Group by 这个东西