分类 默认分类 下的文章

c# webapi 设置输出的class属性

平时做项目的时候大多数时候喜欢用webapi+html静态页面开发
这样的话开发移动端会比较方便

webapi在直接输出类的时候,会序列化所有属性,
底层是通过Newtonsoft.Json来实现的
于是就可以通过给class设置标签来让webapi不序列化某个属性.

[JsonObject(MemberSerialization.OptOut)]
public class LoadModel
{
    [JsonIgnore]
    public HttpPostedFileBase file { get; set; }

    [JsonProperty]
    public string base64 { get; set; }

    [JsonProperty]
    public string type { get; set; }

    public string title { get; set; }
}

当class设置标签为[JsonObject(MemberSerialization.OptOut)]时,属性标签为[JsonIgnore]的不会被序列化

当class设置标签为[JsonObject(MemberSerialization.OptIn)]时,属性标签为[JsonProperty]的会被序列化

一般我喜欢用[JsonObject(MemberSerialization.OptOut)],因为基本上都是要输出的嘛,个别会不输出而已..

canvas如何画出像素为1的线条

先来看一下平时我们html页面上的标签实现1px像素是怎么样的:

<p style="border-bottom: 1px solid #000000;"></p>

1px像素的线条

现在我们放一个canvas标签,画1像素宽的线条看一下:

<body>
    <p style="border-bottom: 1px solid #000000;"></p>
    <canvas id='canvas' width="300" height="100"></canvas>
</body>
<script>
    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    ctx.lineWidth = 1;

    writeLine(0, 10, 300, 10);

    function writeLine(x1, y1, x2, y2) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);

        ctx.stroke();
    }
</script>

canvas画出来的线条

真的好诡异啊,竟然不是1像素的宽度,颜色也有问题....

然后就想着是不是canvas不支持1px像素?再试着画一个宽度为1像素的矩形

ctx.fillRect(0, 20, 300, 1);

画一个宽度为1像素的矩形

发现又好了....太诡异了= =

不停的查资料,后来不断尝试中想到原因:
canvas画线时,是以你的坐标点为中心,左右扩散,来画线的,也就是说他实际是画了一个0,9.5;0,10.5;300,10.5;300,9.5这样一个矩形

这个情况下,因为反锯齿的处理,画布自动帮你填充为了0,9;0,11;300,11;300,9
所以看起来就像是宽了,并且颜色变淡了...

知道原因了,那么来验证一下:

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    ctx.lineWidth = 1;

    writeLine(0, 10, 300, 10);

    ctx.fillRect(0, 20, 300, 1);

    writeLine(0, 30.5, 300, 30.5);

    function writeLine(x1, y1, x2, y2) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);

        ctx.stroke();
    }

线条4

恩,总算是正常了...那么以后,画奇数宽度的线条时就需要注意了:要不就是选点偏移0.5,要不就是整个画布偏移0.5
注意画水平线是x轴偏移,画垂直的时候就是y轴偏移了,保险起见的话,可以两个都偏移:

    var canvas = document.getElementById("canvas");
    var ctx = canvas.getContext('2d');
    ctx.lineWidth = 1;
    ctx.translate(0.5, 0.5);

    writeLine(0, 10, 300, 10);

    function writeLine(x1, y1, x2, y2) {
        ctx.beginPath();
        ctx.moveTo(x1, y1);
        ctx.lineTo(x2, y2);

        ctx.stroke();
    }

c# web配置允许跨域方法

浏览器因为安全原因,默认不允许js代码跨域请求.如果要跨域只能用jsonp.
还可以通过配置web.config文件添加自定义头部来实现允许跨域请求.

如下,在system.webServer标签下添加:

<system.webServer>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" />
  </customHeaders>
</httpProtocol>
</system.webServer>

关于taptap上的calculator通关秘籍

公司最近流行玩一个计算器的小游戏
请输入图片描述

玩了几关感觉很有趣,于是就入坑了.
接着就发现,玩到40多关就继续不下去了.....

看着别人都玩到很后面追不上了,于是狠狠心,拿手边的excel作弊....
花了两天,总算是一边加功能(新的按钮)一边玩游戏,总算玩出了.分享一下工具:
(注意,excel由于安全要求,需要开启宏才能运行脚本程序,不会开启宏的同学自行百度)
比方说最后一关:
请输入图片描述

在excel里按计算机显示的内容填入:
请输入图片描述

然后点cal按钮
然后等待几秒钟....(有些变态关卡会等很久,主要是我的代码没做剪枝优化^_^)

在F1单元格中就会出现答案:7 7 3=>5 shift> inv10 7

按照顺序输入答案.然后就...赢了...^_^
请输入图片描述

傻瓜式操作,都很简单,不过之前的关卡我都是一边玩一边加功能,一边打补丁的.可能会有bug存在(算不出或者程序报错等)
如果发现了欢迎联系作者的邮箱(主页联系作者自己看)

程序代码就不贴了,想看的自己下载,
程序下载路径:http://demo.fengyitong.name/tool/calculator.xlsm

iis Compilation Error 解决方案

今天在虚拟机上发布.net网站
报错为
Compiler Error Message: CS0016: Could not write to output file 'c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root...'

网上找了好多解决方案没有用,最终发现:
"C:\Windows\temp"文件夹加上 IIS_IUSRS的权限就好了。
汗= =