写点东西来吐槽一下自己,真是无语了。
首先,写这篇博文的目的是给未来自己看的,希望以后每天都读一下,这样就不会犯错误了。
前两天,在开发项目的时候,写一个功能,就是使用 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 自己写的代码,不要过于“相信”自己。
- 如果陷在一个问题,试着跳出这个问题,散散步,或者喝一杯茶,也许就会发现问题所在了。
谨记谨记。。。
微信公众号:你好架构
出处:http://www.cnblogs.com/xishuai/
公众号会不定时的分享有关架构的方方面面,包含并不局限于:Microservices(微服务)、Service Mesh(服务网格)、DDD/TDD、Spring Cloud、Dubbo、Service Fabric、Linkerd、Envoy、Istio、Conduit、Kubernetes、Docker、MacOS/Linux、Java、.NET Core/ASP.NET Core、Redis、RabbitMQ、MongoDB、GitLab、CI/CD(持续集成/持续部署)、DevOps等等。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。