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


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

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

    谨记谨记。。。

  • 相关阅读:
    灭霸冲刺(7)
    灭霸冲刺(6)
    灭霸冲刺(5)
    灭霸冲刺(4)
    pip安装软件或模块时提示cannot import name 'main'
    mysql的安装与使用
    channels 2.x的使用
    charlesmitmproxyappium的安装与使用
    centos中redis安装
    django+nginx+gunicorn+pipenv微信小程序实践笔记
  • 原文地址:https://www.cnblogs.com/xishuai/p/4138502.html
Copyright © 2020-2023  润新知