当前位置: 首页 > 编程日记 > 正文

《音乐商店》第4集:自动生成StoreManager控制器

一、自动生成StoreManager控制器

二、查看 StoreManager 控制器的代码

现在,Store Manager 控制器中已经包含了一定数量的代码,我们从头到尾重新过一下。

1.访问数据库代码

首先,在控制器中包含了标准的 MVC 控制器的代码,为了使用方便,还可以引用我们的模型类所在的命名空间 MvcMusicStore.Models。控制器还拥有了一个私有的 MusicStoreDBContext的私有成员,以方便控制器中的每个 Action 访问数据库。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;using MvcMusicStore.Models;namespace MvcMusicStore.Controllers
{public class StoreManagerController : Controller{MvcMusicStore.Models.MusicStoreDBContext storeDB= new MvcMusicStore.Models.MusicStoreEntities();

2.Index 和 Details Action

Index 视图获取专辑的列表,包含每一个专辑引用的流派和艺术家信息,向我们在前面 Store控制器的 Browse时候看到的,Index 视图中需要包含对于链接到的流派和艺术家对象来显示相关的信息,所以,在 Index 的 Action 方法中,需要包含这些数据。

public ActionResult Index()
{var albums = storeDB.Albums.Include("Genre").Include("Artist");return View(albums.ToList());
}

在 Details 方法中,类似于 Store 控制器的 Details 方法,通过专辑的 Id 来获取专辑对象,这里使用 Find() 方法完成,最后,把这个对象传递给视图。

//
// GET: /StoreManager/Details/5public ViewResult Details(int id)
{MvcMusicStore.Models.Album album = storeDB.Albums.Find(id);return View(album);
}

3.创建方法 Create

与前面看到的不同,Create 方法需要处理表单,当用户第一次访问地址 /StoreManager/Create 的时候,用户将会看到一个空的表单,HTML 页面中包含一个 <form> 元素,其中包含了下拉列表和文本框等输入元素,用户可以借助他们输入专辑的详细信息。

当用户填写了专辑的信息之后,可以通过点击 “保存” 按钮来提交表单信息到服务器,我们的应用程序可以获取这些信息保存到数据库中。在用户点击 “保存” 的时候,浏览器发出一个 Http 的 Post 请求,到 /StoreManager/Create 地址,表单的内容作为这个 Post 请求的一部分发送回服务器。

ASP.NET MVC 允许我们容易地分割这两种同样对于 Create 方法的请求处理,通过提供两个同名的 Create 方法,一个用来处理 Http Get 请求,一个用来处理 Http Post 请求,区分的方式是在处理 Post 请求的方法前面增加一个 [HttpPost] 的标签。如果增加 [HttpGet] 标签,则表示这个方法仅仅处理 Http Get 请求。通常没有这个标签,则表示无论是 Get 请求还是 Post 请求都可以由这个 Action 方法处理。

使用 ViewBag 向视图传递信息

我们曾经在这个教程的开始使用过 ViewBag, 但是,没有深入讨论它,ViewBag 允许我们向视图传递信息而不需要首先定义强类型的 Model,在创建专辑的 Action 中,因为在表单中需要两个列表框,我们需要向视图传递列表所需要的数据,以便在视图中填充下拉列表框,最简单的方式就是通过 ViewBag 来实现。

ViewBag 是动态对象,这意味着你可以使用 ViewBag.Foo 或者 ViewBag.YourNameHere 形式的属性而不需要预先定义这些属性,控制器中的代码使用 ViewBag.GenreId 和 ViewBag.Artisid 传递流派和艺术家的信息以便生成表单中下拉列表的值,以后,用来在新创建的专辑中使用。

传递到视图的下拉列表的值使用 SelectList 对象表示,对于我们的要求,使用下面的代码。

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name");

方法中的三个参数被用于创建这个对象:

用来生成下拉列表中信息的集合,注意,不是一个字符串集合,我们这里是流派对象的集合。

方法的第二个参数提供下拉列表中的值,这是一个字符串,实际上是流派对象的一个属性 GenreId。

最后的参数提供下拉列表中显示出来的值,这里使用流派的 Name 属性。

理解了上面的内容,代码就很简单了,两个 SelectList 对象通过 ViewBag 传递给视图,没有使用模型对象,我们也没有创建这样用途的模型。

复制代码
// // GET: /StoreManager/Create public ActionResult Create() { ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name"); ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name"); return View(); }
复制代码

在 Create 视图中使用 HtmlHelper 来显示下拉列表

下拉列表的数据已经被传递到了视图中,现在,我们看一下视图如何使用这些数据显示一个下拉列表,在 Create 视图中,将原来显示流派标识的代码

@Html.LabelFor(model => model.GenreId)

修改为

@Html.DropDownList("GenreId", String.Empty)

这里使用了 HtmlHelper ,一个用于视图中生成 Html 的实用工具,使用 HtmlHelper 可以保持我们的视图清楚和易读。Html.DropDownList 助手方法由 ASP.NET MVC 提供,后面可以看到,我们也可以提供自己的助手方法进行扩展。

Html.DropDownList 方法需要两个参数,从哪里获取显示用的列表,和哪一个值需要被预先选中,方法的第一个参数, GenreId,告诉DropDownList 从模型对象或者 ViewBag 对象中寻找名为 GenreId 的属性值,第二个参数用来指出下拉列表默认选中的值。这是创建专辑的表单,所以,没有需要预先选中的值,这里传递了一个 String.Empty 。

获取 Post 表单中的值

我们在前面讨论过,对于一个表单可以有两个对应的处理方法,一个处理 Http Get 请求显示表单,另外一个用于处理 Http Post 请求,用于处理提交的表单数据,注意,在控制器中,处理 Http Post 请求的方法需要通过标签 [HttpPost] 进行标注,这样,这个方法将会被 ASP。NET 仅仅用来处理 Post 请求。

复制代码
// // POST: /StoreManager/Create  [HttpPost] public ActionResult Create(Album album) { if (ModelState.IsValid) { storeDB.Albums.Add(album); storeDB.SaveChanges(); return RedirectToAction("Index"); } ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name", album.GenreId); ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name", album.ArtistId); return View(album); }
复制代码

这个 Action 方法完成四个任务:

  1. 读取表单的数据
  2. 检查表单的数据是否通过了验证规则
  3. 如果表单通过了验证,保存数据,然后显示更新之后的专辑列表
  4. 如果表单没有通过验证,重新显示带有验证提示信息的表单。

通过模型绑定获取表单数据

控制器处理的表单提交中包含了流派的标识 GenreId 和 艺术家标识 ArtistId,这些来自下拉列表框,以及通过文本框输入的 Title,Price 等等数据,虽然可以直接通过 FormCollection 来访问表单数据,但是,更好的做法是使用 ASP.NET MVC 内置提供的模型绑定。

当 Action 方法的参数是模型类型的时候,ASP.NET MVC 将会试图使用表单中的数据来填充对象的属性,它通过检查表单参数的名字是否匹配模型对象的属性来进行,例如,对于专辑对象的 GenreId 属性来说,它将会在表单数据中查找名为 GenreId 的值赋予它。当使用标准的模型方式生成视图的时候,表单会使用模型对象的属性名称来生成表单输入项目的名称,这样,在发出表单的时候,请求参数就会正好匹配模型的属性了。

验证模型

通过访问 ModelState 的 IsValid 属性就可以检查模型是否通过验证。这里我们还没有为 Album 提供任何的验证规则,后面我们就会提供,所以,这里的验证并没有实际的作用。验证的重要性取决于我们定义的在模型上的验证规则,如果我们已经提供了对于 ModelState 的 IsValid 检查的话,以后增加验证规则就不需要修改这里的代码。

保存提交的数据

如果提交的数据通过了验证,下一步就可以保存到数据库中,使用 EF,仅仅需要将模型对象加入到 Albums 的集合中,然后调用 SaveChanges 方法就可以了。

db.Albums.Add(album);
db.SaveChanges();

EF 将会生成适当的 SQL 命令来持久化对象,保存数据之后,我们重定向到专辑列表的页面,以便看到更新之后的内容。这可以通过调用 RedirectToAction 方法,并提供 Action 方法的名称来完成。在这里,我们使用 Index 。

显示带有验证提示信息的表单

如果没有通过验证,与 GET 处理的时候相同,我们通过 ViewBag 传递下拉列表的值,通过模型传递其他的数据,验证的提示信息由 @HtmlValidationMessageFor 助手方法自动显示在页面上。

测试创建表单

测试一下,运行程序,访问 /StoreManager/Create,你将会看到一个由 StoreManagerController 的 Create 方法处理  Http Get 请求生成的空白表单。

填写一些内容,然后点击创建按钮提交表单。

可以看到内容已经被添加。

处理编辑

编辑处理的一对 Action 方法非常类似我们刚刚看到的 Create 处理。由于编辑的情况需要对已经存在的唱片进行处理,在编辑的 Get 方法中,我们使用唱片的 Id 来加载原有的唱片,这个参数通过路由传递过来,实际的代码类似在 Details 中看到的处理。除了专辑对象,同时还有处理下拉列表,所以,这里也通过 ViewBag 来处理,这样就允许我们在传递一个 Model 的同时还通过 ViewBag 传递了两个额外的 SelectList。

复制代码
// // GET: /StoreManager/Edit/5 public ActionResult Edit(int id) { Album album = storeDB.Albums.Find(id); ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name", album.GenreId); ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name", album.ArtistId); return this.View(album); }
复制代码

处理 Post 请求的 Edit 方法也非常类似于 Create 的 Post 处理方法,仅有的不同就是不用创建一个新的专辑对象加入到集合中,而是将现有的专辑对象,注意已经通过模型绑定获取了请求参数,将这个对象的状态属性 State 修改为 Modified ,这就回告诉 EF 我们正在修改一个存在的专辑对象,而不是创建一个新的。

复制代码
// POST: /StoreManager/Edit/5 [HttpPost] public ActionResult Edit(Album album) {     if (ModelState.IsValid)     {         storeDB.Entry(album).State = System.Data.EntityState.Modified;         storeDB.SaveChanges();         return RedirectToAction("Index"); } ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name", album.GenreId); ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name", album.ArtistId); return View(album); }
复制代码

注意,这个时候,编译器会提示一个错误:

类型“System.Data.EntityState”在未被引用的程序集中定义。必须添加对程序集“System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。         F:\Lesson\MVC\MvcMusicStore\MvcMusicStore\Controllers\StoreManagerController.cs 76     17     MvcMusicStore

添加这个程序集的引用。

下面我们运行程序测试一下,浏览/StoreManager,然后点击 Edit 链接。

点击 Save, 回到专辑列表,可以看到值已经被更新了。

处理删除

删除的处理模式与 Edit 和 Create 一样,使用一个控制器的 Action 显示确认信息,使用另外一个 Action 来处理提交。

删除的 Get 处理非常类似于前面的 Details 处理。

复制代码
// // GET: /StoreManager/Delete/5 public ActionResult Delete(int id) { Album album = storeDB.Albums.Find(id); return View(album); }
复制代码

使用 Delete 视图模板显示强类型的 Album 表单。

默认的 Delete 视图使用模型来显示信息,但是,我们仅仅需要简单地显示确认信息就可以了,把这个视图修改一下,变成下面的样子。

复制代码
@model MvcMusicStore.Models.Album @{     ViewBag.Title = "Delete"; } <h2>     Delete Confirmation</h2> <p>     Are you sure you want to delete the album titled <strong>@Model.Title</strong>? </p> @using (Html.BeginForm()) {     <p>         <input type="submit" value="Delete" /> </p> <p> @Html.ActionLink("Back to List", "Index") </p> }
复制代码

这样,确认页面就成了下面的样子。

点击 Delete 按钮之后,将导致表单发送到服务器,执行 DeleteConfirmed 的 Action 处理方法。

复制代码
// // POST: /StoreManager/Delete/5 [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { Album album = storeDB.Albums.Find(id); storeDB.Albums.Remove(album); storeDB.SaveChanges(); return RedirectToAction("Index"); }
复制代码

在我们的 Post 处理中,完成了下面的任务

  1. 通过专辑的 Id 加载专辑对象
  2. 删除专辑,然后保存所做的修改
  3. 重新定向到 Index, 显示删除专缉之后的列表。

测试一下这些工作,运行程序,选择一个专辑,然后删除它。

点击删除之后,显示了第一张专辑的删除确认页面。

点击删除之后,原来的专辑已经消失了。

二、修改Index视图

记住,虽然脚手架可以为我们自动生成代码,但只是标准的 ASP.NET MVC 代码, 就像我们的这个教程可以节省你的学习时间一样,支架可以节省你手工创建控制器,以及强类型视图的时间,但是,具体的细节内容还是需要自己来处理。

所以,让我们来快速编辑一下 StoreManager 的 Index 视图(/Views/StoreManager/Index.cshtml)。这个视图通过一个 table 表格显示专辑的列表,包含专辑的公共属性,还带有进行编辑/详细内容/删除的链接。我们要删除专辑艺术家的链接,我们不需要显示这个值,在视图中的 <table> 部分,删除 AlbumArtUrl 相关的 <th> 和  <td> 元素,下面的代码中高亮显示的部分。

这样, Index 视图的代码应该如下所示:

@model IEnumerable<MvcMusicStore.Models.Album> 
@{ ViewBag.Title = "Index"; 
}
<h2>Index</h2>
<p>@Html.ActionLink("Create New", "Create")
</p>
<table><tr><th>Genre</th><th>Artist</th><th>Title</th><th>Price</th><th></th></tr>@foreach (var item in Model){ <tr><td>@Html.DisplayFor(modelItem => item.Genre.Name)</td><td>@Truncate(item.Artist.Name, 25)</td><td>@Truncate(item.Title, 25)</td><td>@Html.DisplayFor(modelItem => item.Price)</td><td>@Html.ActionLink("Edit", "Edit", new { id = item.AlbumId }) |@Html.ActionLink("Details", "Details", new { id = item.AlbumId }) |@Html.ActionLink("Delete", "Delete", new { id = item.AlbumId })</td></tr> }
</table>

三、运行效果

现在,可以运行一下了,访问 /StoreManager 可以得到如下的结果。

点击编辑链接,将会显示一个带有专辑字段的编辑表单。

点击位于底部的返回列表链接,然后,点击详细内容链接, 将会显示单个专辑的详细信息。

再来一次,回到列表,点击删除链接,现在将会看到一个确认对话框,显示了专辑的详细内容,请你确认是否真的需要删除。

点击底部的删除按钮,将会删除这个专辑,然后返回 Index 列表视图,专辑已经被删除了。

我们的工作还没有完成,我们要开始对控制器和视图的 CRUD 操作进行处理了。

转载于:https://www.cnblogs.com/meetyy/p/4072565.html

相关文章:

StringUtils

/需要导入第三方jar包pinyin4j.jarimport net.sourceforge.pinyin4j.PinyinHelper;import java.util.regex.Matcher; import java.util.regex.Pattern;public class StringUtils {protected static final String TAG StringUtils.class.getSimpleName();/*** 增加空白*/public…

微信支付invalid total_fee 的报错

因为我的测试商品是0.01的 原因是微信支付的金额是不能带小数点的 直接在提交的时候 乘以 100操作 &#xff0c;因为里面设置参数的时候是 以分为单位的 [packageParams setObject: price forKey:"total_fee"]; //订单金额&#xff0c;单位为分

帧编码 场编码_去年,我帮助举办了40场编码活动。 这是我学到的。

帧编码 场编码by Florin Nitu通过弗洛林尼图 去年&#xff0c;我帮助举办了40场编码活动。 这是我学到的。 (I helped host 40 coding events last year. Here’s what I learned.) Our local freeCodeCamp study group in Brasov, Romania just held its 40th event. We even…

HDU 4540 威威猫系列故事――打地鼠(DP)

D - 威威猫系列故事――打地鼠Time Limit:100MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4540Description 威威猫最近不务正业&#xff0c;每天沉迷于游戏“打地鼠”。 每当朋友们劝他别太着迷游戏&#xff0c;应该好好工…

iOS 在每一个cell上添加一个定时器的方案

1 首先创建一个数组&#xff0c;用来创建所有的定时器的时间 - (NSMutableArray *)totalLastTime {if (!_totalLastTime) {_totalLastTime [NSMutableArray array];}return _totalLastTime; }2 当从网络请求过来时间之后&#xff0c;循环遍历&#xff0c;行数和时间作为Key&a…

用字符串生成二维码

需要导入Zxing.jar包import android.graphics.Bitmap;import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix;public class ZxingCode {/** * 用字符串生成…

在JavaScript中重复字符串的三种方法

In this article, I’ll explain how to solve freeCodeCamp’s “Repeat a string repeat a string” challenge. This involves repeating a string a certain number of times.在本文中&#xff0c;我将解释如何解决freeCodeCamp的“ 重复字符串重复字符串 ”挑战。 这涉及重…

杭电2099 整除的尾数

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2099 解题思路&#xff1a;将a扩大100倍之后&#xff0c;再给它从加上i(i从0到99)&#xff0c;一个一个的看哪一个能整除 反思&#xff1a;末两位是00的时候输出的是00&#xff08;这种情况题目里面的测试数据给…

iOS 验证码倒计时按钮

具体使用 [SmsTimerManager sharedManager].second (int)time; [[SmsTimerManager sharedManager] resetTime]; [SmsTimerManager sharedManager].delegate self; [strongSelf updateTime];设置代理方法 更新按钮的标题 (void)updateTime { if ([SmsTimerManager sharedMan…

树莓派centos安装的基本配置

萌新再发一帖&#xff0c;这篇文章呢主要是为大家在树莓派上安装centos以后提供一个问题的解决方案。 首先我呢觉得好奇就在某宝上花了两百来块钱买了一套树莓派&#xff0c;很多人喜欢在树莓派上安装Debian&#xff0c;我呢更青睐用Red Hat的系统&#xff0c;毕竟对Red Hat更熟…

token拦截器阻止连接_如何防止广告拦截器阻止您的分析数据

token拦截器阻止连接TL;DR Theres dataunlocker.com service coming soon (subscribe!), along with the open-sourced prototype you can use for Google Analytics or Google Tag Manager (2020 update).TL; DR即将推出dataunlocker.com服务 (订阅&#xff01;)&#xff0c;以…

使用Fiddler手机抓包https-----重要

Fiddler不仅可以对手机进行抓包&#xff0c;还可以抓取别的电脑的请求包&#xff0c;今天就想讲一讲使用Fiddler手机抓包&#xff01; 使用Fiddler手机抓包有两个条件&#xff1a; 一&#xff1a;手机连的网络或WiFi必须和电脑&#xff08;使用fiddler&#xff09;连的网络或Wi…

strtok和strtok_r

strtok和strtok_r原型&#xff1a;char *strtok(char *s, char *delim); 功能&#xff1a;分解字符串为一组字符串。s为要分解的字符串&#xff0c;delim为分隔符字符串。 说明&#xff1a;首次调用时&#xff0c;s指向要分解的字符串&#xff0c;之后再次调用要把s设成NULL。 …

iOS 标签自动布局

导入SKTagFrame SKTagFrame *frame [[SKTagFrame alloc] init];frame.tagsArray self.bigModel.Tags;// 添加标签CGFloat first_H 0;CGFloat total_H 0;for (NSInteger i 0; i< self.bigModel.Tags.count; i) {UIButton *tagsBtn [UIButton buttonWithType:UIButtonT…

引导分区 pbr 数据分析_如何在1小时内引导您的分析

引导分区 pbr 数据分析by Tim Abraham蒂姆亚伯拉罕(Tim Abraham) 如何在1小时内引导您的分析 (How to bootstrap your analytics in 1 hour) Even though most startups understand how critical data is to their success, they tend to shy away from analytics — especial…

SSL 1460——最小代价问题

Description 设有一个nm(小于100)的方格&#xff08;如图所示&#xff09;&#xff0c;在方格中去掉某些点&#xff0c;方格中的数字代表距离&#xff08;为小于100的数&#xff0c;如果为0表示去掉的点&#xff09;&#xff0c;试找出一条从A(左上角)到B&#xff08;右下角&am…

在Windows 7下面IIS7的安装和 配置ASP的正确方法

在Windows 7下如何安装IIS7&#xff0c;以及IIS7在安装过程中的一些需要注意的设置&#xff0c;以及在IIS7下配置ASP的正确方法。 一、进入Windows 7的 控制面板&#xff0c;选择左侧的打开或关闭Windows功能 。二、打开后可以看到Windows功能的界面&#xff0c;注意选择的项目…

适配iOS 13 tabbar 标题字体不显示以及返回变蓝色的为问题

// 适配iOS 13 tabbar 标题字体不显示以及返回变蓝色的为问题 if (available(iOS 13.0, *)) {//[[UITabBar appearance] setUnselectedItemTintColor:Color_666666];}

企业不要求工程师资格认证_谁说工程师不能成为企业家?

企业不要求工程师资格认证by Preethi Kasireddy通过Preethi Kasireddy 谁说工程师不能成为企业家&#xff1f; (Who says engineers can’t become entrepreneurs?) A lot of people warned me not to walk away from my great position at Andreessen Horowitz to pursue so…

BestCoder Round #92 比赛记录

上午考完试后看到了晚上的BestCoder比赛,全机房都来参加 感觉压力好大啊QAQ,要被虐了. 7:00 比赛开始了,迅速点进了T1 大呼这好水啊!告诉了同桌怎么看中文题面 然后就开始码码码,4分16秒AC了第一题 7:05 开始看第二题 诶诶诶!!~~~~直接爆搜不久能过吗? 交了一发爆搜上去,AC了,…

[cocos2dx UI] CCLabelAtlas 为什么不显示最后一个字

CClabelAtlas优点&#xff0c;基本用法等我就不说了&#xff0c;这里说一个和美术配合时的一个坑&#xff01;就是图片的最后一位怎么也不显示&#xff0c;如下图中的冒号不会显示 查了ASCII码表&#xff0c;这个冒号的值为58&#xff0c;就是在9&#xff08;57&#xff09;的后…

iOS 13 适配TextField 崩溃问题

iOS 13 之后直接通过以下方式修改Textfield的时候会出现报错信息 [_accountText setValue:Color_666666 forKeyPath:"_placeholderLabel.textColor"]; 报错信息 Access to UITextField’s _placeholderLabel ivar is prohibited. This is an application bug 解决…

测试django_如何像专业人士一样测试Django Signals

测试djangoby Haki Benita通过Haki Benita 如何像专业人士一样测试Django Signals (How to test Django Signals like a pro) For a better reading experience, check out this article on my website.为了获得更好的阅读体验&#xff0c;请在我的网站上查看此文章 。 Djang…

C#中静态方法的运用和字符串的常用方法(seventh day)

又来到了今天的总结时间&#xff0c;由于昨天在云和学院学的知识没有弄懂&#xff0c;今天老师又专门给我们非常详细地讲了一遍&#xff0c;在这里非常谢谢老师。O(∩_∩)O 话不多说&#xff0c;下面就开始为大家总结一下静态方法的运用和字符串的常用方法。 理论&#xff1a;静…

raid 磁盘阵列

mkdir /uuu #建挂载目录echo "- - -" > /sys/class/scsi_host/host2/scan #扫描新硬盘 lsblk #查看 parted /dev/sdb #分区 parted /dev/sdc lsblk mdadm -Cv /dev/md1 -l1 -n2 -c128 /dev/sd[b,c]1 #raid1配置&#xff0c; /dev/md1名字&#…

iOS 13 如何删除SceneDelegate

Xcode11之后新创建的工程会多出两个文件SceneDelegate。那么我们如何让它变回之前的那样的工程呢。 一、将这两个文件删除。 会报错There is no scene delegate set. A scene delegate class must be specified to use a main storyboard file. 二、将Info.plist 中的 SceneMai…

女性程序员大会ghc_在女性科技大会上成为男人的感觉

女性程序员大会ghcby Elijah Valenciano通过伊莱贾瓦伦西亚诺 在女性科技大会上成为男人的感觉 (What It’s Like to be a Man at a Women’s Tech Conference) To be honest, I was very nervous. A few panicked thoughts started to flood my mind as I prepared myself to…

cf776G.Sherlock and the Encrypted Data

题意:对于一个16进制数x,把x的各个数位拿出来,设其为t1,t2,...,定义s(x)为2^t1|2^t2|...,如x0x3e53,则s(x)2^3|2^14|2^5|2^316424.给出q组询问l,r(l,r也是16进制数,不超过15位),求[l,r]中有多少个数x满足x^s(x)<x. 这题题解写的是个状压数位dp,但是蒟蒻不会数位dp,自己YY了一…

c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

说明&#xff1a;文章中关于operator实现的示例&#xff0c;从语法上是对的&#xff0c;但逻辑和习惯上都是错误的。 参见另一篇专门探究operator的文章&#xff1a;《c&#xff0c;operator》http://www.cnblogs.com/mylinux/p/4113266.html 1.构造函数与析构函数不会被继承&a…

json转换模型利器--JSONExport

JSONExport 从json 到 Model &#xff0c;如此的方便 swift oc java 全部支持