一、简化null判空

再写Controller代码的时候有一处判空:

db.Users.Single(x => x.ID == housework.ToID).Username ? null :

这句代码还没写完,VS就提示此处可以简化null判空,去搜索了一下,发现语法糖一枚:

//假如有如下判空
A == null ? B : A
//可以使用 ?? 运算符简化为
A ?? B

喜闻乐见的结局——之后发现原来的写法有bug,没用上这个语法糖。

二、List<>类型与IQueryable<>,IEnumerable<>类型的相互转换

参考

IQueryableIEnumerable 转为List类型可以使用ToList()方法:

users.ToList();

List转为 IQueryableIEnumerable 也有一个方法,名为AsQueryable()AsEnumerable()

var houseworkShowcase = new List<HouseworkShowcaseViewModel>();

... ...

return View(houseworkShowcase.AsQueryable());

三、<p><pre>标签内容自动换行

参考

总言之,手动设定<p><pre>标签的 white-spaceword-wrap 属性即可:

<div>
    <h3>事务描述</h3>
    <p style="white-space: pre-wrap; word-wrap: break-word;">@Html.Raw(Model.Content)</p>
</div>

有一页面需要提交表单,表单中有一hidden type的input标签,包含页面模型的ID属性。

通常情况下,我选择将value写在type和name中间,将模型的属性值直接给value,不加引号,像这样:

这种情况下,ASP.NET生成出的页面代码是正常的,即value的值是正常的ID属性的值。

但是如果将value移到最后写,与input的结束标签连起来,又不加引号,像这样:

最后ASP.NET生成的页面代码会变成这样:

value的值会包含结束标签的斜杠,导致无法正常传输属性值,加入引号后恢复正常:

环境

  • .NET Core 2.1

参考

步骤

具体的原理可见参考链接,总言之是通过IApplicationLifetime这个接口中的StopApplication()方法结束网站运行。

  1. IApplicationLifetime依赖注入
    private IApplicationLifetime applicationLifetime;
    
    public HomeController(IApplicationLifetime _applicationLifetime) {
        applicationLifetime = _applicationLifetime;
    }
  2. 定义一个Action,在其中调用StopApplication()方法,并返回一个空的Result
    [HttpGet("Shutdown")]
    public IActionResult Shutdown() {
        applicationLifetime.StopApplication();
        return new EmptyResult();
    }
  3. 开始调试,这里不选择IIS以方便查看效果
  4. 成功生成运行后会弹出控制台窗口,显示网站运行的一些信息
  5. 然后访问关闭网站Action的URL
  6. 访问后显示网站运行信息的控制台窗口会自动关闭,代表程序已经退出。
  7. 如果使用IIS代理网站,在网站自动关闭后再次访问URL(生成新的request),则网站会自动重启,达到访问URL来重启网站的效果。