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

ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider

NameValueCollectionValueProvider采用一个NameValueCollection作为数据源,DictionnaryValueProvider的数据源类型自然就是一个Dictionnary。NameValueCollection和Dictionnary都是一个键值对的集合,它们之间的不同之处在NameValueCollection运行元素具有相同的Key,Dictionnary却要求元素的Key具有唯一性。[本文已经同步到《How ASP.NET MVC Works?》中]

目录
一、DictionaryValueProvider<TValue>
二、RouteDataValueProvider
三、HttpFileCollectionValueProvider
四、ChildActionValueProvider
五、实例演示:ChildActionValueProvider的值提供机制
六、ValueProviderCollection

一、DictionaryValueProvider<TValue>

DictionnaryValueProvider的类型全名为System.Web.Mvc.DictionaryValueProvider<TValue>,如下面的代码片断所示,DictionaryValueProvider<TValue>实现了IEnumerableValueProvider和IValueProvider接口,构造函数接受一个IDictionary<string, TValue>对象,该对象表示作为数据源的字典。定义在DictionaryValueProvider<TValue>中所有方法的逻辑与定义在NameValueCollectionValueProvider中的同名方法并没有本质区别。

   1: public class DictionaryValueProvider<TValue> : IEnumerableValueProvider, IValueProvider
   2: {
   3:     public DictionaryValueProvider(IDictionary<string, TValue> dictionary, CultureInfo culture);
   4:     public virtual bool ContainsPrefix(string prefix);
   5:     public virtual IDictionary<string, string> GetKeysFromPrefix(string prefix);
   6:     public virtual ValueProviderResult GetValue(string key);
   7: }

二、RouteDataValueProvider

将当前路由数据作为数据源的RouteDataValueProvider继承自DictionaryValueProvider<TValue>。如下面的代码片断所示,基于当前Controller上下文构建的RouteDataValueProvider直接将表示当前路由数据的RouteData对象的Values属性(这是一个RouteValueDictionary对象)作为数据来源。

   1: public sealed class RouteDataValueProvider : DictionaryValueProvider<object>
   2: {
   3:     public RouteDataValueProvider(ControllerContext controllerContext) : 
   4:         base(controllerContext.RouteData.Values, CultureInfo.InvariantCulture)
   5:     {
   6:     }
   7: }

三、HttpFileCollectionValueProvider

我们可以通过类型为file的输入元素进行文件的上传,在表示HTTP请求的HttpRequestBase对象中,上传文件通过只读属性Files表示。从下面的代码片断所示,该属性类型为HttpFileCollectionBase,是一个元素类型为HttpPostedFileBase的集合。

   1: public abstract class HttpRequestBase
   2: {   
   3:     public virtual HttpFileCollectionBase Files { get; }
   4: }
   5: public abstract class HttpFileCollectionBase : NameObjectCollectionBase, ICollection, IEnumerable
   6: {   
   7:     public virtual string[] AllKeys { get; }
   8:     public override int Count { get; }
   9:     public virtual HttpPostedFileBase this[int index] { get; }
  10:     public virtual HttpPostedFileBase this[string name] { get; }
  11: }
  12: public abstract class HttpPostedFileBase
  13: {
  14:     public virtual void SaveAs(string filename);
  15:  
  16:     public virtual int ContentLength { get; }
  17:     public virtual string ContentType { get; }
  18:     public virtual string FileName { get; }
  19:     public virtual Stream InputStream { get; }
  20: }

用于处理上传文件的Action方法通常定义类型为HttpPostedFileBase及其列表的参数来表示上传的文件,针对HttpPostedFileBase参数的Model绑定选用的数据就来源于表示当前请求的HttpRequestBase的Files属性,而具体参数值的提供最终通过具有如下定义的HttpFileCollectionValueProvider来实现。

   1: public sealed class HttpFileCollectionValueProvider : DictionaryValueProvider<HttpPostedFileBase[]>
   2: {    
   3:     public HttpFileCollectionValueProvider(ControllerContext controllerContext);
   4: }

如上面的代码所示,HttpFileCollectionValueProvider继承自DictionaryValueProvider<TValue>,泛型参数TValue的类型为HttpPostedFileBase数组,这是因为在同一个表单中可以定义多个同名的文件输入元素,所以在以文件元素名称作为Key的字典中,字典元素的值自然就是一个HttpPostedFileBase的列表。

为了让读者对HttpFileCollectionValueProvider采用的针对上传文件的值对象提供机制具有一个深刻的认识,我们来进行一个简单的实例演示。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中创建一个具有如下定义的HomeController。该Controller类型中定义了两个Action方法,默认的Index方法会将默认的View呈现出来,DisplayPostedFiles方法则通过创建的HttpFileCollectionValueProvider对象将上传文件的文件名称呈现出来。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View();
   6:     }
   7:     [HttpPost]
   8:     public void DisplayPostedFiles()
   9:     {
  10:         HttpFileCollectionValueProvider valueProvider = new HttpFileCollectionValueProvider(ControllerContext);
  11:         IEnumerable<HttpPostedFileBase> foo = (IEnumerable<HttpPostedFileBase>)valueProvider.GetValue("foo").ConvertTo(typeof(IEnumerable<HttpPostedFileBase>));
  12:         IEnumerable<HttpPostedFileBase> bar =  (IEnumerable<HttpPostedFileBase>)valueProvider.GetValue("bar").ConvertTo(typeof(IEnumerable<HttpPostedFileBase>));
  13:  
  14:         Response.Write("foo<br/>");
  15:         foreach (var file in foo)
  16:         {
  17:             Response.Write(file.FileName + "<br/>");
  18:         }
  19:  
  20:         Response.Write("<br/>bar<br/>");
  21:         foreach (var file in bar)
  22:         {
  23:             Response.Write(file.FileName + "<br/>");
  24:         }            
  25:     }
  26: }

在DisplayPostedFiles方法中,我们针对当前Controller上下文创建HttpFileCollectionValueProvider对象,然后分别将字符“foo”和“bar”作为Key得到两个HttpPostedFileBase对象列表,并将它们的文件名打印出来。下面的代码表示Action方法Index对应的View。在一个针对Action方法DisplayPostedFiles的表单中我们定义了三个文件输入元素,其中前两个名称为“foo”和“bar”。

   1: @{
   2:    using(Html.BeginForm("DisplayPostedFiles","Home", 
   3:        FormMethod.Post,new {enctype="multipart/form-data"}))
   4:    {
   5:        <ul>
   6:         <li>File 1: <input type="file" name="foo"/></li>
   7:         <li>File 2: <input type="file"  name="foo"/></li>
   8:         <li>File 3: <input type="file"  name="bar"/></li>
   9:        </ul>  
  10:        <input type="submit" value="提交" />       
  11:     }
  12: }

当我们运行该程序的时候,浏览器上会出现一个包含三个文件输入元素和提交按钮的页面。然后我们从本地选择任意三个文件(比如text1.txt、text2.txt和text2.txt)并点击“提交”按钮,界面上会出现如下所示的输出结果。

   1: foo
   2: text1.txt
   3: text2.txt
   4:  
   5: bar
   6: text3.txt

四、ChildActionValueProvider

子Action和普通意义上的Action的不同之处在于它不能用于响应来自客户端的请求,而在某个View中被调用以生成某个部分的HTML。View中针对某个子Action方法的调用通过如下所示的HtmlHelper的扩展方法Action来实现。

   1: public static class ChildActionExtensions
   2: {
   3:     //其他成员
   4:     public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName);
   5:     public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, object routeValues);
   6:     public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName);
   7:     public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, RouteValueDictionary routeValues);
   8:     public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues);
   9:     public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues);  
  10: }

顾名思义,ChildActionValueProvider专门服务于针对子Action方法参数的Model绑定。如下面的代码片断所示,ChildActionValueProvider依然是DictionaryValueProvider<TValue>的继承者,不过这里的泛型参数类型Object。那么在作为数据源的字典中,具体的Key和Value究竟是怎样一个对象呢?

   1: public sealed class ChildActionValueProvider : DictionaryValueProvider<object>
   2: {
   3:     public ChildActionValueProvider(ControllerContext controllerContext);
   4:     public override ValueProviderResult GetValue(string key);
   5: }

当我们创建针对指定的Controller上下文创建一个ChildActionValueProvider对象时,会获取描述针对该上下文路由信息的RouteData对象,并将其Values属性表示的RouteValueDictionary对象作为其数据源,这可以从如下所示的ChildActionValueProvider的构造函数定义看出来。

   1: public sealed class ChildActionValueProvider : DictionaryValueProvider<object>
   2: {
   3:     //其他成员   
   4:     public ChildActionValueProvider(ControllerContext controllerContext) :  base(controllerContext.RouteData.Values, CultureInfo.InvariantCulture)
   5:     {
   6:     }
   7: }

但是ChildActionValueProvider的GetValue方法获取的值却并不是简单地来源于构造时针对当前上下文的路由信息,不然ChildActionValueProvider就和RouteDataValueProvider没有什么分别了。实际上,ChildActionValueProvider的GetValue方法获取的值来源于调用HtmHelper的扩展方法Action时通过参数routeValues指定的RouteValueDictionary。

现在我们来简单介绍一下定义在ChildActionValueProvider的GetValue方法中的对象值的提供机制。如下面的代码片断所示,ChildActionValueProvider具有一个字符串类型的静态字段_childActionValuesKey。当该类型第一次被加载时,该字段被初始化成一个GUID。

   1: public sealed class ChildActionValueProvider : DictionaryValueProvider<object>
   2: {
   3:     //其他成员
   4:     private static string _childActionValuesKey = Guid.NewGuid().ToString();
   5: }

在某个View中通过HtmlHelper的扩展方法Action执行子Action方法时,如果通过参数routeValues指定的RouteValueDictionary不为空,会基于这个对象创建一个DictionaryValueProvider<TValue>对象。然后将这个对象添加到通过routeValues表示的原始的RouteValueDictionary对象中,对应的Key就是ChildActionValueProvider的静态属性_childActionValuesKey表示的GUID。

这个RouteValueDictionary被进一步封装成表示请求上下文的RequestContext对象,目标子Action所在的Controller会在该请求上下文中被激活,而在Controller激活过程中表示Controller上下文的ControllerContext被创建出来,毫无疑问它包含了之前创建的RouteValueDictionary对象。而我们针对当前Controller上下文创建ChildActionValueProvider的时候指定的作为数据源的RouteValueDictionary对象就是这么一个对象。

   1: @Html.Action("XxxChildAction", new {Foo=123, Bar = 456, Baz=789})

举个例子,假设我们在某个View中如果如下的方式调用当前Controller的子Action方法 XxxChildAction,并指定相应的路由数据(Foo、Bar和Baz)。最终作为ChildActionValueProvider数据源的Dictionary<string,object>对象结构如下图所示。

image

当调用ChildActionValueProvider的GetValue方法获取指定Key的值时,实际上并不会直接根据指定的Key去获取对应的值,而是根据通过其静态字段_childActionValuesKey值去获取对应的DictionaryValueProvider<object>对象。然后再调用该对象的GetValue根据指定的Key去获得相应的值。

五、实例演示:ChildActionValueProvider的值提供机制

为了印证上面介绍的关于ChildActionValueProvider的值提供机制,我们来演示一个简单的实例。在进行演示之前有一个点需要作一下简单说明,对于DictionaryValueProvider<TValue>对象来说,最终作为其数据源的通过私有字段_values表示的一个Dictionary<string, ValueProviderResult对象。当我们调用GetValue方法是,只需要根据指定的Key从该字典对象中返回相应的ValueProviderResult即可。

   1: public class DictionaryValueProvider<TValue> : IEnumerableValueProvider, IValueProvider
   2: {
   3:     //其他成员
   4:     private readonly Dictionary<string, ValueProviderResult> _values;
   5: }

在通过Visual Studio的ASP.NET MVC 项目模板创建的空Web应用中定义如下一个默认的HomeController。默认的Action方法Index仅仅是将默认的View呈现出来而已,并没有特别之处。在另一个Action方法DisplayRouteData中,我们名称分别为Foo、Bar和Baz的三个路由数据篡改成“abc”、“ijk”和“zyz”。然后根据当前Controller上下文创建一个ChildActionValueProvider对象,并通过反射的方式获取通过它的私有字段_values表示的Dictionary<string, ValueProviderResult对象。

   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         return View();
   6:     }
   7:  
   8:     public ActionResult DisplayRouteData()
   9:     {
  10:         ControllerContext.RouteData.Values["Foo"] = "abc";
  11:         ControllerContext.RouteData.Values["Bar"] = "ijk";
  12:         ControllerContext.RouteData.Values["Baz"] = "xyz";
  13:  
  14:         StringBuilder sb = new StringBuilder();
  15:         ChildActionValueProvider valueProvider = new ChildActionValueProvider(ControllerContext);
  16:         FieldInfo valuesField = typeof(DictionaryValueProvider<object>).GetField("_values", BindingFlags.Instance|BindingFlags.NonPublic);
  17:         Dictionary<string, ValueProviderResult> values = (Dictionary<string, ValueProviderResult>)valuesField.GetValue(valueProvider);
  18:         foreach (string key in values.Keys)
  19:         {
  20:             sb.Append(string.Format("{0}: {1}<br/>", key, values[key].RawValue));
  21:             DictionaryValueProvider<object> innerValueProvider = values[key].RawValue as DictionaryValueProvider<object>;
  22:             if (innerValueProvider == null)
  23:             {
  24:                 continue;
  25:             }
  26:             sb.Append(string.Format("&nbsp;&nbsp;&nbsp;&nbsp;{0}: {1}<br/>", "Foo", innerValueProvider.GetValue("Foo").RawValue));
  27:             sb.Append(string.Format("&nbsp;&nbsp;&nbsp;&nbsp;{0}: {1}<br/>", "Bar", innerValueProvider.GetValue("Bar").RawValue));
  28:             sb.Append(string.Format("&nbsp;&nbsp;&nbsp;&nbsp;{0}: {1}<br/>", "Baz", innerValueProvider.GetValue("Baz").RawValue));
  29:         }
  30:  
  31:         sb.Append("<br/>ChildActionValueProvider.GetValue()<br/>");
  32:         sb.Append(string.Format("{0}: {1}<br/>", "Foo", valueProvider.GetValue("Foo").RawValue));
  33:         sb.Append(string.Format("{0}: {1}<br/>", "Bar", valueProvider.GetValue("Bar").RawValue));
  34:         sb.Append(string.Format("{0}: {1}<br/>", "Baz", valueProvider.GetValue("Baz").RawValue));            
  35:  
  36:         return Content(sb.ToString());
  37:     }
  38: }

我们创建一个StringBuilder对象,并将用于输出获取到的Dictionary<string, ValueProviderResult>对象的Key和Value的HTML添加其中。在进行遍历过程中,如果ValueProviderResult对象的RawValue属性是一个DictionaryValueProvider<object>对象,则调用其GetValue方法得到Key分别为Foo、Bar和Baz的值。相应的输出的HTML一并添加到StringBuilder中。

在程序的最后,我们直接调用ChildActionValueProvider的GetValue方法获取针对Foo、Bar和Baz作为Key的值,并将输出Key和Value的HTML添加到StringBuilder中。最终针对生成的HTML字符串返回一个ContentResult对象。如下所示的代码反映Action方法Index对应的View的定义,在这里我们直接调用HtmlHelper的扩展方法Action执行定义在HomeController的Action方法DisplayRouteData,并指定了相应的路由数据(Foo、Bar和Baz)。

   1: @Html.Action("DisplayRouteData", new { Foo = 123, Bar = 456, Baz = 789 })

运行我们的程序会在浏览器中得到如下的输出结果。我们可以从中看到针对于Controller和Action名称的路由数据和调用HtmlHelper扩展方法Action指定的数据数据均在作为ChildActionValueProvider数据源的字典对象中。除此之外,还具有一个DictionaryValueProvider<object>对象,对应的Key是一个GUID,这正是我们上面介绍的针对在HtmlHelper扩展方法Action中指定的路由数据创建的DictionaryValueProvider<object>对象,而调用GetValue方法获取到的值最终是通过它提供的。

   1: Foo: abc
   2: Bar: ijk
   3: Baz: xyz
   4: controller: Home
   5: action: DisplayRouteData
   6: 289594f6-dfba-45b9-8abb-158b4a582911: 
   7:     System.Web.Mvc.DictionaryValueProvider`1[System.Object]
   8:     Foo: 123
   9:     Bar: 456
  10:     Baz: 789
  11:  
  12: ChildActionValueProvider.GetValue()
  13: Foo: 123
  14: Bar: 456
  15: Baz: 789

六、ValueProviderCollection

类型ValueProviderCollection不仅仅表示一个ValueProvider对象的集合,还作为一个单纯的ValueProvider来使用。如下面的代码片断所示,ValueProviderCollection不仅仅继承自Collection<IValueProvider>,还同时实现了IValueProvider、IEnumerableValueProvider和IUnvalidatedValueProvider三个接口。

   1: public class ValueProviderCollection : Collection<IValueProvider>, IUnvalidatedValueProvider, IEnumerableValueProvider, IValueProvider
   2: {
   3:     public ValueProviderCollection();
   4:     public ValueProviderCollection(IList<IValueProvider> list);
   5:  
   6:     public virtual bool ContainsPrefix(string prefix);
   7:     public virtual IDictionary<string, string> GetKeysFromPrefix(string prefix);  
   8:     public virtual ValueProviderResult GetValue(string key);
   9:     public virtual ValueProviderResult GetValue(string key, bool skipValidation);   
  10: }

对于两个实现值提供机制的GetValue方法重载来说,ValueProviderCollection会遍历集合直到找到一个GetValue方法返回值不为Null的ValueProvider,而该返回值就是该方法的返回值。如果所有ValueProvider的GetValue方法均返回Null,则ValueProviderCollection的GetValue方法也为Null。也就是说,ValueProvider在集合中的先后次序决定了其使用优先级

如果有任何一个ValueProvider的ContainsPrefix方法返回True,则ValueProviderCollection的ContainsPrefix也返回True。GetKeysFromPrefix方法的逻辑与GetValue方法类似,它会遍历作为集合中实现了IEnumerableValueProvider接口的所有ValueProvider对象,并将指定的前缀作为参数调用ContainsPrefix方法,如果返回值为True,则直接返回GetKeysFromPrefix方法的结果;否则返回一个空的Dictionary<string, string>对象。

ASP.NET MVC以ValueProvider为核心的值提供系统: NameValueCollectionValueProvider
ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider
ASP.NET MVC以ValueProvider为核心的值提供系统: ValueProviderFactory

相关文章:

串口 发送 接收 高位_电工进阶PLC大神,必备PLC串口通讯的基本知识!

戳上方蓝字“技成电工课堂”快速关注&#xff01;&#xff01;&#xff01;电力作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f;1&#xff0c;什么是串口通讯&#xff1f;串口是计算机上一种…

HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...

1.connectionRequestTimout 指从连接池获取连接的timeout 2.connetionTimeout 指客户端和服务器建立连接的timeout&#xff0c; 就是http请求的三个阶段&#xff0c;一&#xff1a;建立连接&#xff1b;二&#xff1a;数据传送&#xff1b;三&#xff0c;断开连接。超时后会Con…

搜索引擎优化培训教程

很详细的搜索引擎优化培训教材 View more presentations from mysqlops 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2967982.html

C语言-扫雷游戏

头文件 #ifndef __MINE_H__ #define __MINE_H__#define LINE 10 #define LIST 10 #define ROWS 6 #define COWS 6int game(char UserBoard[LINE2][LIST2], char PlayerBoard[LINE][LIST]); void PrintBoard(char Playerboard[LINE][LIST]); void MineLay(char UserBoard[LINE …

PHP的命令行脚本调用

1.使用PHP命令调用php脚本接受键盘输入然后输出 1 <?php 2 fwrite(STDOUT, "Please input your name:\t"); 3 $name trim(fgets(STDIN)); 4 fwrite(STDOUT, Hello . $name); 5 ?> 2.使用PHP命令调用php脚本并接受参数 1 <?php2 if($ar…

控制输入框只能输入数字

1.将input的属性type改为number 2.这时的输入框会有小箭头&#xff0c; 去掉小箭头的方法&#xff0c;给input添加样式 input::-webkit-outer-spin-button,input::-webkit-inner-spin-button { -webkit-appearance: none;}input[type"number"] { -moz-appearan…

main函数参数,在VS中向命令行添加参数的方法

问题描述 使用main函数的参数&#xff0c;实现一个整数计算器&#xff0c;程序可以接受三个参数&#xff0c;第一个参数“-a”选项执行加法&#xff0c;“-s”选项执行减法&#xff0c;“-m”选项执行乘法&#xff0c;“-d”选项执行除法&#xff0c;后面两个参数为操作数。 例…

2.monotouch 控件的使用

1.我们打开一个xib 右下角会看到如下图所示&#xff1a; 这一部分包含了界面和各种各样的控件。选取一个控件&#xff0c;使用鼠标拖动到界面上即可使用。 2.选中一个控件&#xff0c;该控件的相关信息会在右边进行显示。做出相关设置即可。 3.设置控件属性和绑定控件事件。 首…

python视频延迟严重_【Python】改善 VideoCapture 的影像延迟

许多的范例程序大多仅介绍该如何用 VideoCapture 撷取摄影机的画面&#xff0c;却没有充分说明其隐含的问题。以下示范一个最基本的影像撷取程序。# -*- coding: utf-8 -*-import cv2# ip camera 的撷取路径URL "rtsp://admin:admin192.168.1.1/video.h264"# 建立 V…

CentOS 6.0配置pptp ××× Client和Squid透明网关

目的&#xff1a; 构建一台单网卡Linux网关&#xff08;透明代理&#xff09;&#xff0c;该网关拨入某海外服务器&#xff0c;客户端设定该网关后&#xff0c;网络出口则为海外服务器&#xff0c;实现加速访问一些网站的目的。 环境信息&#xff1a; 硬件&#xff1a;DELL机器…

mysql汉字转拼音函数

-- 创建汉字拼音对照临时表 CREATE TABLE IF NOT EXISTS t_base_pinyin (pin_yin_ varchar(255) CHARACTER SET gbk NOT NULL,code_ int(11) NOT NULL,PRIMARY KEY (code_) ) ENGINEInnoDB DEFAULT CHARSETlatin1;-- 插入数据 INSERT INTO t_base_pinyin (pin_yin_,code_) VAL…

数据挖掘的一些经典算法

数据挖掘能做以下七种不同事情&#xff08;分析方法&#xff09;&#xff1a;数据挖掘能做以下七种不同事情 分类 &#xff08;Classification&#xff09; 估计&#xff08;Estimation&#xff09; 预测&#xff08;Prediction&#xff09; 相关性分组或关联规则&#xff08;…

python cx oracle安装_python3.6的安装及cx_oracle安装

一、创建所需目录mkdir -p /home/用户名/software/python3.6.1mkdir -p /home/用户名/priv/bydmkdir -p /home/用户名/priv/byd/src/pythonmkdir -p /home/用户名/priv/byd/org二、修改byd目录的权限cd /home/用户名/priv/llchmod 777 byd/ll三、将安装包放到byd中&#xff0c;…

opencv 无法找到tbb_debug.dll

本人环境&#xff1a;vs 2010 在opencv(你的opencv install 路径)\build\common\tbb\ia32\vc10下&#xff0c;将tbb.dll 拷贝一份&#xff0c;改名为tbb_debug.dll. 并将此路径加入到系统环境变量中即可。转载于:https://blog.51cto.com/danielllf/871369

【天命奇御】成就进度62/71的通关攻略(1·开篇前言)

天命奇御于2018.8.9号在wegame上发售 先是一周目记录&#xff1a; 可以说一周目是熟悉最终boss技能后&#xff0c;靠技术过的...... 然后是二周目记录&#xff1a; 开篇前言&#xff1a; 转载于:https://www.cnblogs.com/wuduojia/p/9494700.html

使用git上传代码到github

1. github上创建项目 github是一个服务器托管商&#xff0c;我们写好的代码可以上传到github上面去 登录github的官方网站&#xff1a;http://github.com/ 注册一个自己的用户 新建一个项目&#xff0c;我这里有我自己的一个github账号&#xff0c;我直接登录上去了&am…

gpg加密命令 linux_用 PGP 保护代码完整性(五):将子密钥移到一个硬件设备中 | Linux 中国...

在这个系列教程中&#xff0c;将为你提供使用 PGP 和保护你的私钥的最佳体验。-- Konstantin Ryabitsev致谢译自 | linux.com 作者 | Konstantin Ryabitsev译者 | LCTT / qhwdw在这个系列教程中&#xff0c;将为你提供使用 PGP 和保护你的私钥的最佳体验。在本系列教程中&#…

在Android使用XML文件控制按钮文字在各种状态下的颜色

最近在项目中遇到新的需求&#xff0c;就是在按钮在选按的时候需要将文字变为白色&#xff0c;但android默认的按钮颜色为黑色&#xff0c;之前也没有考虑过类似的问题。 通过doc文档&#xff0c;发现按钮文字的处理方式和背景的处理方式很相似&#xff0c;同样可以用一份selec…

人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理

第一步是考虑静态实现。整个页面分成几大块&#xff0c;比如&#xff1a; <div class"section" id"topic-a"></div> <div class"section" id"topic-b"></div> <div class"section" id"topi…

Python内部类,内部类调用外部类属性,方法

一 Python中内部类 典型定义&#xff1a; class MyOuter:age18def __init__(self,name):self.namenameclass MyInner:def __init__(self,inner_name):self.inner_nameinner_nameoutMyOuter(lqz) innerout.MyInner(lqz_inner) print(inner.inner_name) 二 内部类调用外部类的类属…

POJ 2528 Mayor's posters(线段树)

题目大意 贴海报。每张海报的高度都是一样的&#xff0c;唯独宽度不一样。每张海报只能占用整数倍的单位线段长度&#xff0c;贴了 n(n<10000) 张海报之后&#xff0c;有几张能够看见&#xff08;有一个角能看见这张海报也算被看见了&#xff09;&#xff1f;海报的宽度最大…

xmind 模板_xmind模板打包下载

500套xmind模板【分类整合】好东西分享啦&#xff01;~百度网盘下载链接&#xff1a;https://pan.baidu.com/s/1pCf8aqM8R8m4U4oWZUfOUA提取码&#xff1a;xt1j 微云盘下载连接&#xff1a; https://share.weiyun.com/5c3vehsXMind中的思维导图结构包含一个中心根主题&#xff…

Pycharm的运行和简单调试

我这里已经简单的创建了一个文件&#xff0c;为了浅显易懂&#xff0c;这里程序写的比较简单 1. 运行程序 首先&#xff0c;找到编辑窗口上面有一个向下方向的灰色箭头&#xff0c;点击它 点击之后&#xff0c;选择第一个选项edit Configurations&#xff0c;然后在弹出…

为什么百度只收录我的网站首页?

在我们做SEO的时候&#xff0c;经常碰到一个常见的问题&#xff0c;百度只收录网站的首页或者是一夜之间网站的收录变成了只剩首页。出现这种情况的原因很多&#xff0c;我们需要去检查自己的问题&#xff0c;然后去解决&#xff0c;让自己的网站重新获得更多页面的收录&#x…

Python3.5 学习十二 数据库介绍

MYSQL介绍&#xff1a; 主流三种数据库&#xff1a;Oracle、Mysql、Sqlserver Mysql安装和启动&#xff1a; windows 1安装 2启动服务 3进入bin目录&#xff0c;打开命令行 4 mysqladmin -u root password ******* 设置密码 5 mysql -u root -p 使用密码登录 显示所有数据…

github上删除一个仓库

首先进入到你需要删除的仓库&#xff0c;在这个页面的左侧或者上部找到”settings”选项 点击进入”settings”&#xff0c;然后一直往下拉&#xff0c;直到看到一个红色的横条区域&#xff0c;下面有一个”Delet this respository”&#xff0c;点击删除即可

两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问

在开发多线程程序时&#xff0c;如果每个多线程处理的事情都不一样&#xff0c;每个线程都互不相关&#xff0c;这样开发的过程就非常轻松。但是很多时候&#xff0c;多线程程序是需要同时访问同一个对象&#xff0c;或者变量的。这样&#xff0c;一个对象同时被多个线程访问&a…

AE 9.3代码 升级到AE10.0

下载的代码是AE 9.3&#xff0c;本机配置是AE 10.0 &#xff0c;程序打不开&#xff0c;运行不了&#xff0c;提示找不到ESRI.ArcGIS.Controls.AxMapCongrol等等AE 控件。 具体解决方法&#xff1a; &#xff08;1&#xff09; 在引用中&#xff0c;重新添加ArcGIS引用&#xf…

mysql数据库主从同步过程详述(三)

续mysql数据库主从同步过程详述(二)在此说明下:在最后试验过程中,当查看从库状态的时候,IO_Running显示为no,从error_log中看到如下报错提示:120523 0:55:31 [Note] Slave I/O thread: connected to master rep192.168.1.5:3306, replication started in log mysql-bin.0000…

[No0000160]常用C# 正则表达式大全

正则表达式的本质是使用一系列特殊字符模式&#xff0c;来表示某一类字符串。正则表达式无疑是处理文本最有力的工具&#xff0c;而.NET提供的Regex类实现了验证正则表达式的方法。Regex 类表示不可变&#xff08;只读&#xff09;的正则表达式。它还包含各种静态方法&#xff…