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

率先,写那篇博文的指标是给未来友美观的,希望以后每一天都读一下,那样就不会犯错误了。

前两日,在支付品种的时候,写3个效益,就是采取 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 代码,拷贝在 VS二〇一六 中,当时没怎么在意,你能够仔细看下 GetAjaxInfo
中的 Html
字符,会意识中间莫名多了二个“空格”,哎,哎,哎,当自个儿意识是以此题材的时候,笔者的首先设法是:窗户在哪儿???作者要跳下去。

###当然,3个标题场景注脚不了本身有多“”,就在今天,又是看似的题材,哎!

本身利用 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 本人写的代码,不要过于“相信”自个儿。
  • 若果陷在贰个题材,试着跳出这几个标题,散散步,大概喝一杯茶,可能就会意识难点所在了。

谨记谨记。。。

相关文章