C#学习零散笔记

C#新手学习快速成长学习资源汇总 目录 一:引言 二:.NET技术体系 三:常用工具汇总 四:学习资源汇总 五:书籍推荐 六:关于阅读技术书籍的经验 七:总结   一:引言 因为工作调整,从PHP开发零基础转型到.NET开发,前期没有太多空闲时间去系统学习。只好独辟蹊径,寻找快速掌握满足当前需求的方法,和大家分享: :先搜集.NET平台重点知识点的概念名称,然后通过网络搜集 阅读详情

随着用C#做东西,零零散散记录过程的一些笔记,用的是asp.net MVC4,动态更新如下...

-- asp.net中根据选择的后台开发语言类型不同,视图的后缀名也不同,如 C#语言 视图后缀名为*.cshtml, VB语言对应的为 *.vbhtml;

-- C#中是区分大小写的,即大小写敏感;

-- 视图引擎为Razor时,部分表达书写方法:
@...; @(...); @Html.Raw(...); @{...;...; }; @的输入为双写 @@ 或 写&#64; 注释 @*...*@; @(Html.someMethod<xType>()); @RenderBody();  @RenderSection("xSectionName",[true|false]);

-- 如果某文件夹A下存在 _ViewStart.cshtml, 则其被最优先执行,然后再执行A下的其它 *.cshtml, 该*.cshtml文件同时也递归应用到文件夹A下的子文件;

-- 返回部分视图结果,尤其是ajax部分取数据时,最后在controller的action中用 return PartialView(); 返回数据;
public class HomeController:Controller{
public ActionResult getUserInfo(){
//...code...
return PartialView();
}
}

-- 视图引擎在本地项目的 Gloval.asax.cs 文件中注册或配置,但如更换其它视图引擎则在该文件的Application_start方法中配置,如:
protected void Application_start(){
ViewEngines.Engines.clear(); //Razor,webForm引擎默认是被注册的
ViewEngines.Engines.add(new MyViewEngine());
RegisterRoutes(RouteTable.Routes);
}

-- 创建自定义视图引擎时,需要实现 IViewEngine 接口和 IView 接口;

-- @Html.ActionLink("链接标题","链接URL"); 建立一个链接;

-- DB链接字符串放在 web.config 文件中,公约为:
...
<connectionStrings>
<add name="xDB" connectionString="data source=.\serverName;Integrated security=SSPI;initial catalog=DBName" 
ProviderName="System.Data.Sqlclient"/>
</connectionStrings>
...

--  在Controller中方法的前面加[HttpGet]表示该方法只处理http的 GET 请求,这也是默认的请求方式;

-- 在Controller中方法的前面加[HttpPost]表示该方法只处理http的 POST 请求;

-- 在Controller的Action中在方法的前面加 [OutputCache(Duration=0)] 表示在请求输出缓存时间为0,即不缓存;

-- Session变量操作
创建 Session["xName"] = "value";  清空值 Session["xName"] = null; 取值 string a = Session["xName"].ToString(); 存在判断 if(null == Session["xName"]){...}

-- Cookies操作:
是否存在名为 xName 的cookie: if(Request.Cookies["xName"] == null)
读取 cookie : string a = Request.Cookies["xName"].Value;
设置 cookie 值:Response.Cookies["xName"].Value = "zhangsan";
设置 cookie 过期时间:HttpCookie myCookie = new HttpCookie("xName"); myCookie.Expires = DateTime.Now.AddDays(1);
清空 cookie 就是设置cookie时间过过期即可,如 myCookie.Expires = DateTime.Now.AddDays(-2);

-- C#中的属性,如果操作的是属性名本身,则get, set的方法可省略方法体; 如:
public string Message {get; set;}

-- C#中的属性,如果操作的是非属性名本身,则get, set的方法提供方法体,其中进行具体的操作; 如:
private int _category = 0;
public int Category {
get { return _category; }
set { _category = value; }
}

-- Controller中如果方法前面加 [AllowAnonymous]表示该方法允许匿名访问,即任何人都可访问;

-- 前面有 [Authorize] 标识符的类表示需要授权操作;

-- @Html.DropDownList("id",string.Empty); 用于创建select下拉菜单;

-- @using(Html.BeginForm()){ ... } 用C#创建一个表单;

-- @Html.EditorFor(model => model.Title) 用于产生一个input type=text的元素;

--  ~ 在Asp.net中是web应用程序根目录的运算符,只能在服务器端代码使用;

-- 缓存控制,清空缓存
Response.Buffer = true;
Response.ExpiresAbsolute = System.DateTime.Now.addSeconds(-1);
Response.Expire = 0;
Response.cacheControl= "no-cache";

-- @Styles.Render("~/content/css") 可在页面中用来加载指定绑定名称的CSS文件,可指定多个绑定名称,用逗号隔开, 如:
@Style.Render("~/Content/css1","~/Content/css2"[,...]); 
绑定工作需在项目的App_Start文件夹下的 BundleConfig.cs 完成。

-- @Scripts.Render("~/content/script") 可在页面中用来加载指定绑定名称的Script文件,可指定多个绑定名称,用逗号隔开, 如:
@Scripts.Render("~/xpath/script1","~/xpath/script2"[,...]); 
绑定工作需在项目的App_Start文件夹下的 BundleConfig.cs 完成。

-- jQuery将参数以JSON格式发送,结果以JSON格式接受:
$.ajax({
url:'xpath/xURL',
type:'GET', //POST
dataType:'JSON',  //结果返回数据格式JSON
data:{'Name':'zhangsan','age':28},
contentType:'application/json; charset=utf-8', //指定内容类型为JSON格式,编码为utf-8
async:true,
timeout:3000,
error:function(){....},
success:function(){...}
});

-- [Serializable] 用在(一般为model)类前面表示该(model)类可进行序列化;

--  C#中将对象以JSON格式返回
return Json(objXXX,JsonRequestBehavior.AllowGet); //objXXX为某对象
方法的返回值类型为 JsonResult 或 ActionResult,同时前端以GET方式提交http请求。

-- 在运行时动态获取web应用程序的根路径: 
string rootSitePath = HttpRuntime.AppDomainAppPath;

-- return RedirectToAction("actionName", "ControllerName");
是在当前action中重定向到名称为ControllerName的控制器中名为actionName的action中;
[注意:ControllerName是路由器中设定的名称规则,即控制器文件名称不含Controller.cs部分];
如果是转到本控制器内部的另一个action,则第二个参数ControllerName可省略;
例如:
return RedirectToAction("Index", "Home"); 即在当前的action中重定向到名为Home[文件名为HomeController.cs]的控制器中名为Index的action中;
return RedirectToAction("Logout"); 即在当前的action中重定向到本控制器内部名为Logout的action中;

-- ModelState.AddModelError("errorKey","errorValue");
该语句向字典类型的ModelState中添加一条错误信息,该错误信息在控制器对应的视图中可用
@Html.ValidationMessage(errorKey)  或 @Html.ValidationSummary() 来显示[Razor引擎]

-- @Url.Content("~/Resources/")
这个是建立基于根目录下开始的Resources/路径

-- @Url.Content("/Home/Logout")
这个是建立基于当前(上下文)控制器Home下的Logout的action连接

-- _ViewStart.cshtml 是asp.net mvc4.0 默认的视图页,任何返回视图都以之开始执行,同时跟@renderBody()部分视图合并共同组合成完整的视图页。

-- 当哪个页面比如登录页,不需要执行或不需要_ViewStart.cshtml返回的视图时,在该页顶部加入如下代码即可:
@{
Layout = "~/Views/Shared/_NoRender.cshtml"; @* 也即将Layout的值指向没有头尾的的页 *@
}

同时在上面指定的路径[如~/Views/Shared/]下建立_NoRender.cshtml文件,其内容为 @RenderBody()即可。


-- 在Razor引擎的视图中引用某个命名空间的对象如下
@using com.projectName.Entity;


-- 在Razor引擎的视图中使用session对象
@{
UserSession userSession = @Session["UserSession"] as UserSession;   //UserSession实现定义好
}


-- 在Razor引擎的视图中判断字符串的长度
@{
string usertitle = "0123456789";
string showTemp = string.Empty;
if(usertitle.Length > 10){
showTemp = usertitle.Substring(0,10) + "...";
}
}

-- 在Razor引擎的视图中判断字符串是否为空或null值
@{
string myword = "...";
if(string.IsNullOrEmpty(myword)){
...
}else{
...
}
}

-- C# 中 cookie设置
// 将当前语言名称设置到cookie中
HttpCookie _cookie = new HttpCookie("cookieName", "cookieValue");
_cookie.Expires = DateTime.Now.AddYears(1); //set expires time
controller.HttpContext.Response.SetCookie(_cookie);

-- C# 中 cookie读取
HttpCookie cookie = controller.HttpContext.Request.Cookies["cookieName"]; //get cookie object
string ckValue = cookie.value; //get cookie value

-- C# 中设置和清空session变量
Session.Clear(); //清空
Session["varName"] = "varValue"; //设置值
Session["varName"] = null; //置空

-- C# 中的email发送
过程是先建立MailMessage对象[设置各个参数],然后通过SmtpClient对象[由设置各个参数]把MailMessage对象发送出去;

//部分关键程序集
using System.Net.Mail;

string emilSender = "Lisi";
List<string> emailList = new List<string>();
string mailSubject = "mailSubject";
StringBuilder mailBody = new StringBuilder();

emailList.Add("abc@163.com");
emailList.Add("zhangsan@163.com");
mailBody.Append("<div>用户Zhangsan:</div>");
mailBody.Append("<div>Email内容:abcd text...</div>");

MailMessage mailMessage = MyEMailSender.InitMail(emilSender, emailList, mailSubject, mailBody.ToString(), true);
if (MyEMailSender.Sendmail(mailMessage)){
	return Json(new { isSuccess = true, message = "邮件发送成功!" }, JsonRequestBehavior.AllowGet);
}else{
	return Json(new { isSuccess = false, message = "发送邮件失败!" }, JsonRequestBehavior.AllowGet);
}

//支持类MyEMailSender
//部分关键程序集
using System;
using System.Text;
using System.Net.Mail;
using System.Configuration;
namespace com.myApp.Email
{
    public static class MyEMailSender
    {
        private static SmtpClient smtpClient = new SmtpClient();
        // 发邮件SMTP服务器账户配置
        private static string smtp_host = ConfigurationManager.AppSettings["smtpServer"]; //email server IP
        private static int smtp_port = Convert.ToInt16(ConfigurationManager.AppSettings["smtpPort"]); //email server port
        private static string smtp_user_name = ConfigurationManager.AppSettings["smtpUser"]; //email user name
        private static string smtp_user_pwd = ConfigurationManager.AppSettings["smtpPassword"]; //email password
        /// <summary>
        /// 发送邮件
        /// </summary>
        /// <returns></returns>
        public static bool Sendmail(MailMessage Mail)
        {
            smtpClient.Host = smtp_host;
            smtpClient.Port = smtp_port;
            smtpClient.Credentials = new System.Net.NetworkCredential(smtp_user_name, smtp_user_pwd); //邮箱的用户名和密码
            smtpClient.EnableSsl = false; //ssl加密
            try
            {
                smtpClient.Send(Mail);
                return true;
            }
            catch (System.Net.Mail.SmtpException ex)
            {
                return false;
            }
        }
        /// <summary>
        /// 新建邮件对象
        /// </summary>
        /// <param name="FromAddress"></param>
        /// <param name="ToAddressList"></param>
        /// <param name="MailSubject"></param>
        /// <param name="MailBody"></param>
        /// <param name="IsBodyHtml"></param>
        /// <returns></returns>
        public static MailMessage InitMail(string FromAddress, List<string> ToAddressList, string MailSubject, string MailBody, bool IsBodyHtml = true)
        {
            MailMessage mail = new MailMessage();            
            mail.From = new MailAddress(FromAddress); //发件人            
            foreach (string toAddr in ToAddressList) //收件人
            {
                mail.To.Add(new MailAddress(toAddr));
            }            
            mail.Subject = MailSubject; //邮件主题            
            mail.Body = MailBody; //邮件内容           
            mail.SubjectEncoding = System.Text.Encoding.UTF8;  //邮件主题和正文编码格式
            mail.BodyEncoding = System.Text.Encoding.UTF8;            
            mail.IsBodyHtml = IsBodyHtml; //正文是否Html编码            
            mail.Priority = MailPriority.High; //优先级
            return mail;
        }
        /// <summary>
        /// 新建邮件对象,含发送,抄送,密送邮件
        /// </summary>
        /// <param name="FromAddress"></param>
        /// <param name="ToAddressList"></param>
        /// <param name="MailSubject"></param>
        /// <param name="MailBody"></param>
        /// <param name="BccList"></param>
        /// <param name="CcList"></param>
        /// <param name="IsBodyHtml"></param>
        /// <returns></returns>
        public static MailMessage InitMail(string FromAddress, List<string> ToAddressList, string MailSubject, string MailBody,
            List<string> BccList, List<string> CcList, bool IsBodyHtml = true)
        {
            MailMessage mail = new MailMessage();            
            mail.From = new MailAddress(FromAddress); //发件人            
            foreach (string mailAddr in ToAddressList) //收件人
            {
                mail.To.Add(new MailAddress(mailAddr));
            }
            
            mail.Subject = MailSubject; //邮件主题            
            mail.Body = MailBody; //邮件内容            
            mail.SubjectEncoding = System.Text.Encoding.UTF8; //邮件主题和正文编码格式
            mail.BodyEncoding = System.Text.Encoding.UTF8;            
            mail.IsBodyHtml = IsBodyHtml; //正文是否Html编码            
            mail.Priority = MailPriority.High; //优先级           
            foreach (string mailAddr in BccList)  //密件抄送收件人
            {
                mail.Bcc.Add(new MailAddress(mailAddr));
            }            
            foreach (string mailAddr in CcList) //抄送收件人
            {
                mail.CC.Add(new MailAddress(mailAddr));
            }            
            //mail.Attachments.Add(new Attachment("d:\\tes.txt"));  //添加附件
            return mail;
        }
    }
}

-- 获取当前系统Url路径[asp.net 4.0 C#]
/// <summary>
/// 获取当前系统Url路径
/// </summary>
/// <returns></returns>
[AccessPrivilege(Type = AccessPrivilegeType.ANONYMOUS)]
public ActionResult GetWebPath()
{
      string result = String.Empty;
      result = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
      if (string.IsNullOrEmpty(result))
      {
           result = "127.0.0.1:" + System.Web.HttpContext.Current.Request.Url.Authority; ;
      }
      result = "http://" + result;
      return Json(result);
}

-- C# 对应方法的测试用例

        /// <summary>
        ///A test for CourseMore, 自动生成的完整例子
        ///</summary>
        [TestMethod()]
        public void CourseMoreTest()
        {
	    //ActionResult结果的判断
            HomeController target = new HomeController(); // TODO: Initialize to an appropriate value
            ActionResult expected = null; // TODO: Initialize to an appropriate value
            ActionResult actual;
            actual = target.CourseMore();
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method."); 
        }

        /// <summary>
        ///A test for CourseCompetitiveList,手动修改的例子
        ///</summary>
        [TestMethod()]
        public void CourseCompetitiveListTest()
        {            
	    //JSON结果的判断 
            JsonResult actual = target.CourseCompetitiveList() as JsonResult;
            Assert.IsNotNull(actual);   
        }

-- Razor引擎的语法 [asp.net 4.0 MVC]

1, 单行代码 @xxxx 

example1:
Razor style: <span>@model.Message</span>
web forms style: <span> <%: model.Message %></span>  //仅作比较

example2:
Razor style: <span>ISBN@(isbn)</span>
web forms style: <span>ISBN<%: isbn %></span>
2,代码块 @{xxxx}
//example1: Razor style: 
@{
	int x =123;
	string y = "ok.";
}

webForms style: 
<%
	int x =123;
	string y = "ok.";
%>

//example2: Razor style: 
@foreach ( var item in items ){
	<span>Item @item.name. </span>
}

//webForms style:
<% foreach ( var item in items ){ %>
	<span>Item <%: item.name %>. </span>
<% } %>



//example3: Razor style: 
@if(showMessage){
	<text>This is plain text.</text>
}
或者
@if(showMessage){
	@:This is plain text.
}

//webForms style: 
<% if (showMessage) { %>
	This is plain text.
<% } %>
-- Razor 语法的注释
@* 
...code block...
*@

-- webForm 语法注释

<%--
...code block...
--%>

-- 返回的视图有不同情况
1,没有参数的情况
public ActionResult Index(){
ViewBag.Message = "welcome to ASP.NET MVC 4";
return View();
}
//无参数时默认返回的视图为views文件夹里跟控制器同名的文件夹下的Index.cshtml,即Action方法名跟视图同名;

2,指定参数名称,返回同一文件夹下跟action方法不同名的视图
public ActionResult Index(){
ViewBag.Message = "welcome to ASP.NET MVC 4";
return View("welcome");
}
//有参数时默认返回的视图为views文件夹里跟控制器同名的文件夹下的welcome.cshtml,即Action方法名跟视图不同名,但视图在同一文件夹中;

3,指定参数名称,返回不同文件夹下跟action方法不同名的视图
public ActionResult Index(){
ViewBag.Message = "welcome to ASP.NET MVC 4";
return View("~/Views/Example/Index2.cshtml");
}
//有参数时默认返回的视图为views文件夹里Example文件夹下的Index2.cshtml,即Action方法名跟视图不同名,视图所在文件夹也不同;

--asp.net MVC 4.0 Razor [C#] 验证码问题

(1)生成验证码类

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Drawing;
using System.Drawing.Imaging;

namespace com.proNameSpace.Utils
{
    public static class ValidateCodeUtility
    {
        /// <summary>
        /// 生成验证码图片
        /// </summary>
        /// <param name="validateCode"></param>
        /// <returns></returns>
        public static Bitmap CreateImage(string validateCode)
        {
            int iwidth = (int)(validateCode.Length * 14);
            Bitmap image = new Bitmap(iwidth, 23);
            Graphics graphics = Graphics.FromImage(image);
            graphics.Clear(Color.White);
            //定义颜色
            Color[] colors = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
            //定义字体 
            string[] fonts = { "Verdana", "Georgia", "Comic Sans MS", "Tahoma", "宋体" };
            Random rand = new Random();
            //随机输出噪点
            for (int i = 0; i < 50; i++)
            {
                int x = rand.Next(image.Width);
                int y = rand.Next(image.Height);
                graphics.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
            }
            //输出不同字体和颜色的验证码字符
            for (int i = 0; i < validateCode.Length; i++)
            {
                int cindex = rand.Next(7);
                int findex = rand.Next(5);
                int fsize = rand.Next(10,14);
                Font font = new Font(fonts[findex], fsize, FontStyle.Bold);
                Brush brush = new SolidBrush(colors[cindex]);
                int j = 4;
                if ((i + 1) % 2 == 0)
                {
                    j = 2;
                }
                graphics.DrawString(validateCode.Substring(i, 1), font, brush, 3 + (i * 12), j);
            }
            //画一个边框
            graphics.DrawRectangle(new Pen(Color.Gray, 0), 0, 0, image.Width - 1, image.Height - 1);
            graphics.Dispose();

            //MemoryStream memoryStream = new MemoryStream();
            //image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            //image.Dispose();
            
            //输出到浏览器
            //HttpContext.Current.Response.ClearContent();
            //HttpContext.Current.Response.ContentType = "image/Jpeg";
            //HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());

            return image;

        }
        /// <summary>
        /// 生成验证码
        /// </summary>
        /// <param name="vCodeLength"></param>
        /// <returns></returns>
        public static string CreateValidateCode(int vCodeLength)
        {
            string Vchar = "1,2,3,4,5,6,7,8,9,Q,W,E,R,T,Y,U,I,P,A,S,D,F,G,H,J,K,L,Z,X,C,V,B,N,M,q,w,e,r,t,y,u,i,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m";// 0,o,O 去掉
            string[] VcArray = Vchar.Split(',');
            //验证码内容
            string ValidateCode = "";
            int temp = -1;

            Random rand = new Random();

            for (int i = 1; i < vCodeLength + 1; i++)
            {
                if (temp != -1)
                {
                    rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
                }
                int t = rand.Next(VcArray.Length);
                if (temp != -1 && temp == t)
                {
                    return CreateValidateCode(vCodeLength);
                }
                temp = t;
                ValidateCode += VcArray[t];
            }
            return ValidateCode;
        }

    }
}

(2)对应控制器

//checkCodeController.cs
namespace com.proNameSpace.Controller
{
    public class VerificationCodeController 
    {

        public ActionResult index()
        {
            //ViewBag.inputMessage = "请输入";
            return View();
        }
        /// <summary>
        /// 默认获取验证码图片
        /// </summary>
        /// <returns></returns>
        [AccessPrivilege(Type = AccessPrivilegeType.ANONYMOUS)]
        public ActionResult GetCodeImg()
        {
            string verificationCode = ValidateCodeUtility.CreateValidateCode(4);
            Bitmap verificationImage = ValidateCodeUtility.CreateImage(verificationCode);
            MemoryStream memoryStream = new MemoryStream();
            verificationImage.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            verificationImage.Dispose();
            Session["chkCode"] = verificationCode;

            //输出到浏览器
            HttpContext.Response.ClearContent();
            HttpContext.Response.ContentType = "image/Jpeg";
            HttpContext.Response.BinaryWrite(memoryStream.ToArray());
            return null;
        }
        /// <summary>
        /// 验证验证码
        /// </summary>
        /// <returns></returns>
        [AccessPrivilege(Type = AccessPrivilegeType.ANONYMOUS)]
        public ActionResult Validate()
        {
            string inputCode = Request.Params["inputCode"];
            bool eq = false;
            if (!string.IsNullOrEmpty(inputCode))
            {
                string serverCode = Session["chkCode"] as string;
                if (string.IsNullOrEmpty(serverCode))
                {
                    return Json(new { isSuccess = false, message = "验证码已过期,请重新获取!" }, JsonRequestBehavior.AllowGet);
                }
                eq = inputCode.ToLower().Equals(serverCode.ToLower());
            }
            if (eq)
            {
                return Json(new { isSuccess = true, message = "验证成功" }, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(new { isSuccess = false, message = "验证码不正确,请重新输入!" }, JsonRequestBehavior.AllowGet);
            }

        }
    }
}

--asp.net mvc4.0 [Razor ,C# ] ,文件上传

(1)相关方法,

        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="file">文件</param>
        /// <param name="type">xFile</param>
        /// <returns></returns>
        private string UploadFile(HttpPostedFileBase file)
        {
            UserSession userSession = Session["UserSession"] as UserSession;
            //Logger.Debug(file.FileName + "... start to upload");
            try
            {
                int fileLength = file.ContentLength;
                string iniFileName = file.FileName;
                string filePath = "d:\uploadFile\";
                //时间戳 作为存储文件的名字
                string timeFileName = DateUtils.GetTimeStamp() + iniFileName.Substring(iniFileName.LastIndexOf("."));

                //insert into db
                myFile mf = new myFile();
                mf.filePath = timeFileName; // filePath + timeFileName;
                mf.cName = iniFileName;
                mf.size = (fileLength/1024);
                DBxxxDAOService.Insert(mf);
                saveFile(filePath, timeFileName, file);
                return mf.Refid;
                
            }
            catch (Exception ex) {
                Logger.Error("upload file error" + file.FileName, ex);
            }
            Logger.Debug(file.FileName + "...  to upload success !");
            return "";     
        }


        /// <summary>
        /// 保存文件
        /// </summary>
        /// <param name="filePath">保存的路径</param>
        /// <param name="timeFileName">文件名</param>
        /// <param name="file">文件</param>
        private void saveFile(string filePath, string timeFileName, HttpPostedFileBase file)
        {
            if (file == null)
            {
                return;
            }
            FileStream writer = null;
            Stream reader = null;
            try
            {
                string fileName = file.FileName;
                string dir = HttpRuntime.AppDomainAppPath + filePath;
                //write to local file
                DirectoryInfo directoryInfo = new DirectoryInfo(dir);
                directoryInfo.Create();//自行判断一下是否存在
                writer = new FileStream(dir + timeFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                reader = file.InputStream;
                byte[] buffer = new byte[10 * 1024];
                int c = 0;
                while ((c = reader.Read(buffer, 0, buffer.Length)) > 0)
                {
                    writer.Write(buffer, 0, c);
                    writer.Flush();
                }
            }
            catch (Exception ex)
            {
                Logger.Error("store file error" + file.FileName, ex);
            }
            finally {
                reader.Close();
                writer.Close();
                GC.Collect();
            }            
      }

(2)相关控制器

	//对应处理controller.cs
        [HttpPost]
        [ValidateInput(false)]
        public ActionResult FileUpload(HttpPostedFileBase file)
        {          
            Logger.Debug(file.FileName + "... start to upload = " );
            string iniFileName = UploadFile(file);
            Logger.Debug(file.FileName + "... end to upload = " );
            return Json(new { success = iniFileName }, JsonRequestBehavior.AllowGet);            
        }













零散表演素材整理:从碎片到可检索项目笔记的系统方法 数字媒体资产管理是内容创作者处理表演素材、视频文件的基础技术。其核心原理是通过元数据标记、标准化命名和分类存储,将零散素材转化为结构化数字资产。这一流程的技术价值在于提升素材检索效率、保障版本一致性,并支持团队协作。在表演记录、特效测试等应用场景中,系统化整理能够避免文件混乱,确保每个项目包含演出类型、关键时间点等最小信息清单。本文以现场演出片段为例,详细介绍如何通过文件夹结构优化、笔记软件模板和标签系统,实现从原始素材到可复用项目笔记的完整工作流,特别适合处理类似TJBB系列中DARK13角色的gear5 阅读详情

相关推荐

破解拼多多网页字体加密的Python实现(静态)

爬取或者复制粘贴出来发现数字不是6372,而是这样的一个东西 ""从上图我们可以看出数字是一行的空白,后面被浏览器渲染后才展现的数字。我们可以用这个代码查看十六位进制对应的十进制,为什么要看十进制呢?​,而字体文件中的字符映射关系(cmap)也是以十进制存储的。我们搜索这个属性我们可以看到第一个这样的属性有一个URL,这个就是解密的字体包。然后我们构造一个这样的映射字典 key就是对应的十进制,后面的值就是对应的数字。然后我们需要封装一个函数,将加密文字和映射字典传入,返回解密后的数字。

weixin_64179111的博客 3540

MVC @RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、@Html.RenderA ...

MVC @RenderBody、@RenderSection、@RenderPage、@Html.RenderPartial、@Html.RenderA ... 1、@RenderBody()   作用和母版页中的服务器控件类似,当创建基于此布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过布局页面的@RenderBody()方法呈现在标签之间。  这个方法不

Litt_J的专栏 1157

Lane、PHY和Preset Value Bit

每个Lane支持不同的传输速度和带宽,例如PCIe 3.0中,一个Lane的传输速度可以达到8 GT/s(Giga Transfers per second),也就是1 GB/s(GigaBytes per second)。Preset Value Bit(预置值位)是在PCIe 3.0的Lane上新引入的一种机制,用于优化信号传输质量。PCIe设备可以包含多个Lane,例如x1、x4、x8、x16等,表示该设备同时使用的Lane数目,比如x16表示该设备采用了16个Lane,具有更高的传输速度和带宽。

weixin_58083606的博客 1297

@RenderBody()和@RenderSection()

强大的Razor引擎  一、Razor基础简介   Razor采用了cshtml后缀的文件名,截图如下:   A、 版面布局   从图上看到,新的视图引擎已经没有了Site.Master这种MasterPage了,取而代之的是_Layout.cshtml和_ViewStart.cshtml。   _Layout.cshtml等同于MasterPage;如下图所示:

jingmeifeng的专栏 6万+

以太网详解(一)-MAC/PHY/MII/RMII/GMII/RGMII基本介绍

网络设备中肯定离开不MAC和PHY,本篇文章将详细介绍下以太网中一些常见术语与接口。 MAC和PHY结构 从硬件角度来看以太网是由CPU,MAC,PHY三部分组成的,如下图示意: 上图中DMA集成在CPU,CPU,MAC,PHY并不是集成在同一个芯片内,由于PHY包含大量模拟器件,而MAC是典型的数字电路,考虑到芯片面积及模拟/数字混合架构的原因,**将MAC集成进CPU而将PHY留在片外,这种...

sternlycore的博客 13万+

无限维李代数局部与2-局部1/2-导子:从概念到Witt代数实例解析

在抽象代数与数学物理中,李代数是描述对称性的基本结构,而导子则是刻画其微分性质的核心算子。从经典的导子概念出发,通过引入“局部”与“分数阶”两个关键推广,形成了局部导子、2-局部导子以及1/2-导子等重要研究方向。这些推广不仅深化了对无限维李代数(如Witt代数、Virasoro代数)复杂结构的理解,其研究方法和结论也为共形场论、可积系统等物理理论提供了数学基础。本文聚焦于无限维李代数上局部与2-局部1/2-导子的系统研究,通过拆解核心概念、剖析典型代数结构,并以Witt代数为实例,详细演示了从全局1/2-

weixin_34072296的博客 392

乡下人重拾MVC——@RenderBody @RenderSection @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderActi...

1. @RenderBody()   代表:是一个占位符,是留给子页面的位置,子页面使用这个模版,子页面中的内容会被放到@RenderBody的位置。合并后当作一个整体加载 2. @RenderSection(string,boolean)   第一个参数是string类型,标明名称;第二个参数是boolean类型,表示子页面是否必须要写它。   代表:是个占位符,解...

weixin_30633507的博客 347

PythonWeb开发框架—Django之工程创建和models的定义和增删改查

文章介绍了Django工程的创建、models的定义和增删改查

weixin_42476668的博客 990

@RenderBody() @RenderSection @RenderPartial 用法

用于渲染视图的主体内容,只能在布局页面中出现一次。:用于定义多个内容区域,可以在视图页面中填充。或:用于渲染部分视图,适合复用 UI 组件。结合使用:可以在布局页面中同时使用和部分视图,实现灵活的页面布局。通过以上方法,可以在布局页面中引用多个视图内容区域,满足复杂的页面布局需求。

zhangyu0412326的博客 1190

allegro如何设置走线等长

设置走线等长!

weixin_42499230的博客 6934

华为OD机试 - 商品推荐多属性排序 - 数组(Python/JS/C/C++ 双机位A卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。双十一来临,小王准备买某个购物平台买坚果。在输入坚果时,页面默认按照综合推荐列表。小王想知道这个综合排序时如何完成的,于是便开始思考算法题。经过一番操作后,完成它的多个关键词排序算法。希望你给小王提供一份正确的排序结果,验证其实现算法结果的准确性

学Java,找哪吒 622

@RenderBody、@RenderPage、@RenderSection的介绍

一、@RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过_Layout.cshtml布局页面的@RenderBody()方法呈现在标签之间。       二、@RenderPage 从名称可以猜出来这个方法是要呈现一个页面。比如网页中固定的头部可以单独放在一个共享的视图文件中,然后在布局页面中通过这

whaxrl的专栏 1435

【数据集】30 m地表温度LST数据集

【数据集】30 m地表温度LST数据集

WW、forever的博客 1130

C#学习笔记之零散笔记

"///"注释的代码,编译器会忽略它们,就像其他注释一样,但可以通过配置vs,在编译项目时,提取这些注释后面的文本,创建一个特殊格式的文本文件,该文件可用于创建文档。为了创建文档,注释必须遵循XML文档的规则。 使用#region和#endregion折叠和展开代码 “@”字符可以一字不变地指定字符串,即两个双引号之间的所有字符都包含在字符串中,包括行末字符和原本需要转义的字符。唯一的例外是必须指...

鱼子酱F的博客 283

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C#学习笔记(一):一些零散但重要的知识点汇总

集合类型 数组 数组需要注意的就是多维数组和数组的数组之间的区别,如下: 1 using System; 2 3 namespace Study 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 //一维...

weixin_30814223的博客 93

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C#零散笔记一

1.C#中把list1的值赋给list2,list2的值会随list1变化而变化,如要使list2的值不随list1变化而变化,可如下赋值:list2.AddRange(list1);2.C#窗体,弹出错误:未能加载工具箱“xxx”,将从工具箱中将其删除。确认平台是否与实际系统一致(X86,X64,AnyCPU)将项目生成属性中的目标平台改为X86或者AnyCpu。3.C#自动带出命名空间快捷键:Alt+Shift+F10。选中项目,右键点击生成。

weixin_57170209的博客 178

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++学习笔记深度整理:从零散知识到系统知识体系构建

在计算机编程领域,系统化知识管理是提升学习效率和工程能力的关键。其核心原理在于通过结构化、关联化的方式,将零散信息内化为个人知识体系,从而建立知识点之间的强关联。这一过程的技术价值在于,它能将被动接收的信息转化为可检索、可连接、可激活的“个人大脑外挂”,显著提升问题解决能力和代码质量。在C++这类复杂语言的学习中,面对诸如**内存管理**、**STL容器**、面向对象、现代C++特性等海量且相互嵌套的知识点,系统化整理尤为重要。通过确立概念、原理、场景三大核心维度,并利用支持双向链接的工具构建网状知识结构,

weixin_30580341的博客 379

C#基础语法要点总结学习笔记

C# (读作“See Sharp”)是一个面向对象的编程语言,且进一步支持面向组件的编程。C# 基于 C 和 C++ 编写,但更接近于java,由微软(Microsoft)开发。C# 采用统一的类型系统。 所有 C# 类型(包括 int 和 double 等基元类型)均继承自一个根 object 类型。 因此,所有类型共用一组通用运算,任何类型的值都可以一致地进行存储、传输和处理。

追求。 2568

回测越测越显著是陷阱?用统计检验与样本外验证排除假信号

在量化金融研究中,回测是评估策略的重要手段,但反复修改参数与条件后,资金曲线不断变好,往往并非策略真的有效,而是过拟合历史噪声的结果。这种“越测越显著”的现象,本质源于数据窥探与多重检验问题,使得统计显著性失真。要识别真正的策略信号,需要借助严谨的统计检验框架,包括收益显著性检验、置换检验、多重检验校正与参数敏感性扫描。样本外验证则能帮助判断策略是否具备稳健的预测能力,而非仅仅适应历史数据。本文面向股票、期货与加密货币策略开发者,提供一套可落地的Python检验流程,帮助研究人员从候选策略中筛除假信号,提升

weixin_34122810的博客 299

C#一些零散的东西

 二维数组:int[,] arr = new int[100, 100]; 图片操作 图片数组:Image[] img = new Image[100]; 给图片赋值(配图): for (int i = 0; i 其中 name表示名称,用于使用时索引。 connectionString为数据库连接字符串。providerName为 所在命名空间,此为确定项。 3 在要引用该连接字符串的项目下添加引用  在用该字符串

huaiyaohuaiyao的专栏 472

C#的一些零散东西

字段声明在类里面,不是声明在方法里面 用静态字段模拟全局变量“方法”这个术语用于表示对象中的函数.Length 和.ToUpper()等。句点字符把对象实例名和属性或方法名分隔开来,方法名后面的()把方法与属性区分开来。每个对象都有一个明确定义的生命周期,除了“正在使用”的正常状态之外,还有两个重要的 阶段: ? 构造阶段:对象最初进行实例化的时期。这个初始化过程称为构造阶段,由构造函数完成

蜗牛的房子 324

【DotNetGuide】C#/.NET/.NET Core学习、工作、面试指南

现如今网上关于Java、前端、Android、Golang...等相关技术的学习资料、工作心得、面试指南一搜都是一大把,但是咱们C#/.NET的相关学习资料、工作心得、面试指南都是寥寥无几。我在微信群和知乎里面经常会看到这样的提问:有没有好的C#/.NET相关的学习书籍、视频教程、项目框架和常见面试题推荐的?。并不是没有人写,而是因为网上的资料和文章太零散了,缺少一个这方面汇总的知识库。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 3079

Python学习 过程中零散知识点的总结

  自学资料比较零碎,本文是对在Python学习过程中积累的零零散散的知识点的总结 ====================================================================== 1. 关于编码的简单介绍   unicode -- 万国码   utf-8 -- 数字、字符用8位,欧洲字符16位来存,中文3个字节24位...

diaojin2421的博客 155
上一篇: JQuery插件写法的总结
下一篇: ASP.Net MVC4 的工程中引入IBatis步骤
shenzhenNBA
博客等级 码龄18年 388粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值