Fork me on GitHub

写点东西来吐槽一下自己,真是无语了。

首先,写这篇博文的目的是给未来自己看的,希望以后每天都读一下,这样就不会犯错误了。

前两天,在开发项目的时候,写一个功能,就是使用 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 自己写的代码,不要过于“相信”自己。
  • 如果陷在一个问题,试着跳出这个问题,散散步,或者喝一杯茶,也许就会发现问题所在了。

谨记谨记。。。

posted @ 2014-12-02 22:01  田园里的蟋蟀  阅读(869)  评论(10编辑  收藏  举报