MVC开发经验总结
网站开发中技术问题的笔记
以下经验基于 MVC 5.2.3
Javascript
BUG思考
200 OK真的表示没有问题吗?
有时候Status 200作为WebAPI的返回值,并不表示真的OK,例如取得一个文件,没有取到,但是返回值也会是200。
200只是表示一个WebAPI执行完毕,没有异常而已,并不表示肯定成功。IIS7.0 上传文件失败,返回404。
乍一看是资源无法找到,其实是设定问题,上传文件的最大长度限制,还需要下面这样的配置。
maxRequestLength很多文章都提到了,maxAllowedContentLength则很多文章没有提到。
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<!--maxRequestLength就是文件的最大字符数,最大值不能超过2个G左右,executionTimeout是超时时间-->
<httpRuntime targetFramework="4.5" maxRequestLength="1073741824" executionTimeout="3600" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!--修改服务器允许最大长度-->
<requestLimits maxAllowedContentLength="1073741824"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
- encodeurl 不能转 ‘&’ 符号
使用Replace 将 ‘&’ 符号转成 ‘%26’。
ReSharp之后的问题
使用了ReSharp的移除没有使用(Remove Unused Reference)的引用之后,Package项目配置文件中的一些Item会被删除掉,在项目发布的时候一些动态链接库不会被发布到BIN目录下面,导致以下这样的问题
未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
![]()
所以一般建议在使用ReSharp之前将项目进行CheckIn,如果出现特殊情况则执行Redo即可。
(具体配置文件:packages.config)
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net451" />
<package id="bootstrap" version="3.3.6" targetFramework="net451" />
<package id="CommonMark.NET" version="0.11.0" targetFramework="net451" />
<package id="Elasticsearch.Net" version="2.1.1" targetFramework="net451" />
<package id="jQuery" version="2.2.2" targetFramework="net451" />
<package id="jQuery.Validation" version="1.15.0" targetFramework="net451" />
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net461" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net461" />
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net461" />
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.1" targetFramework="net451" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net461" />
<package id="Microsoft.Net.Compilers" version="2.0.0-beta1" targetFramework="net451" developmentDependency="true" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" />
<package id="Modernizr" version="2.8.3" targetFramework="net451" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net451" />
<package id="NPOI" version="2.1.3.1" targetFramework="net451" />
<package id="Respond" version="1.4.2" targetFramework="net451" />
<package id="ThoughtWorks.QRCode" version="1.1.0" targetFramework="net451" />
<package id="WebGrease" version="1.6.0" targetFramework="net451" />
</packages>
HttpRequestValidationException:
由于安全上的原因,Asp.net中QueryString等不允许出现<> 这样的字符
如果你确认的确需要跳过安全验证,里面最简单的解决方法是使用Unvalidated版本
string strArticalID = context.Request.Unvalidated.Form["ArticalID"];
Debug版本的时候,VS无法察看很多变量的值,例如Ajax调用ASHX
如果出现多个控制器的时候,可能是因为你的BIN目录没有删除干净,有一个过期的,以前版本的DLL导致的
Asp.net MVC在运行的时候,会将所有Bin下面的DLL进行解析,如果有一个旧的DLL,例如是改名前的DLL残留在Bin目录中,则会出现多个同名控制器的问题。(在VS中怎么检查都不会发现这个问题的!)
如何设定启动Areas?
参见RouteConfig的编写,这里可以指定默认的Area,写法必须严格按照例子.
Home_Default这个路由名字不要使用(可能系统会默认注册这个名字)
(错误信息:路由集合中已存在名为“Home_default”的路由。路由名称必须唯一。)
View的Layout
如果不指定Layout,默认使用 Views/Shared/_Layout(_ViewStart.cshtml)
类似于React的组件,可以使用DisplayFor来显示组件
组件放在Shared/DisplayTemplate/ 下面
px 不能省略,RenderBody() 需要CSS3规范的Style
加上去的话,类名称必须区分大小写,写错则不能识别
这是个浏览器兼容性的话题。有时候你会发现HTML的Class名称大小写写错了,样式也会生效,这是因为你没有加上 DOCTYPE 这个TAG。如果加上之后,则类名称不允许忽略大小写。
Area名称不要使用实体名称,或者其它类的名称,不然需要名字空间前缀
修改Area名称后注意各处名字空间的统一
每个Area的webConfig里面,可以添加默认名字空间
<system.web.webPages.razor>
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
GET方法如果有参数,则如果需要对应可空的情况,可以使用参数默认值
public ActionResult Index(int PageNo = 1)
*如果同时存在 没有参数和带参数的,会报错。可选参数倒没有问题。。。
Controller里面设置过 ViewBag.XXXX,如果在之前使用过Model.XXXX,则ViewBag.XXXX变为Model.XXXX
$ajax的变体
可以使用 $.post来简化Post操作
ASHX里面如何使用Session
添加 IRequiresSessionState 接口即可
public class PublishPost : IHttpHandler, IRequiresSessionState
如何用 Href 实现Post
注意 forms的下标
注意 POST方法必须写明
<div class="SingleBox">
<a href="/Admin/Accept?ArticalID=@Model.ArticalInfo.Sn" class="btn btn-sm btn-success" onclick="return OpenModal(this.href, '确认接受', '确认接受该条记录?')">
<span class="glyphicon glyphicon-remove"> 接受 </span>
</a>
<br /><br />
<form action="/Admin/Reject" method="post">
<a href="javascript:document.forms[2].submit();" class="btn btn-sm btn-danger" onclick="return OpenModal(this.href, '确认拒绝', '确认拒绝该条记录?')">
<span class="glyphicon glyphicon-remove"> 拒绝 </span>
</a>
审核留言:
<input type="text" name="message" style="width:400px" />
<input type="hidden" name="ArticalID" value="@Model.ArticalInfo.Sn" />
</form>
</div>
Javascript操作DOM的Style,属性是直接使用的,不是“xxx:xxx”
document.getElementById("ReplySubmit_" + PreViewReplyId).style.display = "none";
Bootstrap的btn-primary 可能有Submit的功能!!!
Bootstrap的btn-primary 可能有Submit的功能(待验证)
使用过的FileStream可能被清空,注意位置和长度
许多对于Stream的操作都会导致流的位置到EOS,或者整个流的被使用完了(无法复用?)
MvcHtmlString 命令页面生成器不要再次转换字符串了,不然的话,空格等特殊字符将被模板系统自动转换
Jquery Wrap,可以给元素增加父元素。。。。。强大啊。。。
$(document).ready(function () {
$(".PostBody img").wrap(
function () {
var filepath = this.src;
var imagefilename = filepath.substring(_urlstr.length + "/FileSystem/Thumbnail?filename=".length)
@{
string Image = ConfigurationManager.AppSettings["Image"];
string jsCode = string.Empty;
if (Image == "QiNiu")
{
jsCode = "filepath = '" + @ConfigurationManager.AppSettings["URLBASE"] + "' + imagefilename;";
}else
{
jsCode = "filepath = '/FileSystem/Image?filename=' + imagefilename;";
}
}
@MvcHtmlString.Create(jsCode)
//原图是外部连接的处理
if (this.src.indexOf("/FileSystem/Thumbnail") == -1){
if (this.src.indexOf("@ConfigurationManager.AppSettings["URLBASE"]") == -1){
filepath = this.src;
}
}
return "<div class='imgArea'><a href='" + filepath + "'></a></div>"
}
);
C# && Mongo
可以使用转换规则将DateTime变成Local,不用特性
使用特性:
/// <summary>
/// 创建时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime CreateDateTime;
使用转换规则
BsonSerializer.RegisterSerializer(typeof(DateTime), new DateTimeSerializer(DateTimeKind.Local));
可以使用IgnoreIfNullConvention,则空数据不序列化,
也可以IgnoreExtraElementsConvention忽略数据中有,但是数据模型中没有的字段。例如数据模型改名之后,数据库里面的残留字段。
pack.Add(new IgnoreExtraElementsConvention(true));
pack.Add(new IgnoreIfNullConvention(true));
属性和静态变量的区别
属性,公共变量 序列化
静态变量,const 不序列化
可以尝试类的嵌套,可以正常序列化
快速JSON
using Newtonsoft.Json;
var result = new
{
success = 1,
message = "提示的信息,上传成功或上传失败及错误信息等。",
url = filename
};
string json = JsonConvert.SerializeObject(result);
context.Response.Write(json);
HttpPostedFileWrapper
new HttpPostedFileWrapper(file) as HttpPostedFileBase
使用动态对象快速反序列
dynamic obj = JsonConvert.DeserializeObject(sr.ReadToEnd());
图片放大方案
<script type="text/javascript" src="http://tsi.github.io/jQuery.imgBox/imgBox/jquery.imgbox.js"></script>
<link rel="stylesheet" href="http://tsi.github.io/jQuery.imgBox/imgBox/imgbox.css" />
<script>
$(document).ready(function () {
$(".PostBody img").wrap(
function(){
return "<div class='imgArea'><a href='" + this.src + "'></a></div>"
}
);
$(".PostBody .imgArea a").imgbox({
slideshow: false
});
});
</script>
MongoDB Query.EQ可以用来查找列表中是否有数据
IMongoQuery tagNameQuery = Query.EQ(nameof(TagName),tag);
Distinct对于数组的处理,是拆开数组项目,进行Distinct!!!!
使用In表示两个数组是否存在交集(因为In的相等,对于数组是拆开判断的)
Great Linq
Linq可以做很多强大的工作
x.GroupBy((article) => article.OwnerId).Select(group => new { ownerId = group.Key, Count = group.Count() });
Web(ASHX)服务改名:
修改名字的时候,需要同时修改View MarkUp的代码
ActionResult 可以通过来设置缓存时间
/// <summary>
/// 缩略图(JPEG)
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
[OutputCache(Duration = int.MaxValue)]
public ActionResult Thumbnail(string filename)
{
var stream = new MemoryStream();
string Thumbnail = ConfigurationManager.AppSettings["Thumbnail"];
switch (Thumbnail)
{
case "Mongo":
MongoStorage.GetFile(stream, filename, "Thumbnail");
break;
case "FileSystem":
stream = FileSystemStorage.GetFile(filename, "Thumbnail");
break;
case "QiNue":
//实际上这里直接使用QiNue的URL就可以了
stream = QiniuStorage.GetFile(filename);
break;
}
return File(stream.ToArray(), "image/jpeg");
}
BSonDocument 转 ClassObject
BsonSerializer.Deserialize<Article>(doc)
MongoDB暂时无法中文检索在Win平台,中文需要企业版的MongoDB
原因是系统不知道如何进行分词,可以使用第三方的分词组件
MarkDown Editor(Pandao)研究
http://pandao.github.io/editor.md/
Editor 的可配置项目
打开源代码可以看到所有的可配置项目
需要添加
<script src="~/Content/editormd/editormd.min.js"></script>
<link rel="stylesheet" href="~/Content/editormd/css/editormd.css" />
font文件夹也必须,不然部分图标缺失
Convert MD To HTML
Install-Package CommonMark.NET
plugins
图片上传等功能需要使用这个Plugins文件夹里面的插件
autofocus:false
防止自动获得焦点,页面开始时候垂直位置不正确
对于错误的MD语法,该编辑器HTML预览的时候不会报错!!!
浏览器兼容性问题
Chromn 12px 字体变为 16px
由于缩放问题造成的,CSS里面12px,如果缩放之后,系统还是维持原来的字体大小,整个字体在渲染的时候进行放大处理
MVC开发经验总结的更多相关文章
- WebForms VS. MVC(翻译)
(本文翻译自CodeProject上阿三写的一篇文章,原文地址:http://www.codeproject.com/Articles/528117/WebForms-vs-MVC,讲了有关ASP.A ...
- 1.2 认识ASP.NET MVC项目结构
1.开发环境 操作系统:xp.vista.windows 7.windows 8.windows server 2003|2008|2008R2|2012: 集成开发环境IDE: Vsiual Stu ...
- Spring MVC 到 Spring Boot 的简化之路(山东数漫江湖)
背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷.但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的 ...
- Spring MVC 到 Spring BOOT 的简化之路
背景 Spring vs Spring MVC vs Spring Boot Spring FrameWork Spring 还能解决什么问题 Spring MVC 为什么需要Spring Boot ...
- 5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」
希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. Cookie-Based认证 认证流程 我们先看下传统Web端的认 ...
- 通过Blazor使用C#开发SPA单页面应用程序(2)
今天我们尝试创建一个默认的Blazor应用. 1.安装 .Net Core 3.0需要Visual Studio 2019 的支持. 安装.Net Core 3.0 预览版 SDK版本,注意预览版对应 ...
- 将js进行到底:node学习8
Node.js数据库篇--MongoDB 废话:现代web开发可以说完全是数据库驱动的,而对于我这样的PHP程序员来说,对Mysql向来十分钟情,MongoDB的兴起让我不能再对Mysql孤注一掷,& ...
- MVC+linq开发经验
1.Though it is a mass,it will help you out of another mass,so,be glad to face it. 2.吃自己的狗粮.系统像一个房子,一 ...
- MVC CodeFirst简单的创建数据库(非常详细的步骤)
最近在学习MVC的开发,相信有过开发经验的人初学一个新的框架时候的想法跟我一样最关心的就是这个框架如何架构,每个架构如何分工,以及最最关键的就是如何与数据库通信,再下来才是学习基础的页面设计啊等 ...
随机推荐
- Hello Mybatis 01 第一个CRUD
What's the Mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c ...
- 在Gradle中使用jaxb的xjc插件
jaxb,全称为Java Architecture for Xml Binding,是一种将java对象与xml建立起映射的技术.其主要提供两个功能,一是将java对象映射为xml,二是将xml映射为 ...
- jQuery实现放大镜效果
1.1.1 摘要 相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果. 在接下来的博文中,我们将向 ...
- vs如何在C++中调用Lua
最近Cocos2dx的学习卡壳了,一般的照抄代码我不想写上来,但想示例也想得我头晕...为了放松大脑调整状态于是开始学习Lua.Lua的语法学习还是比较简单的,学过javascript或者vbscri ...
- js选项卡
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- jQuery对 动态添加 的元素 绑定事件(on()的用法)
从jQuery 版本 1.7 起,on() 方法是向被选元素添加事件处理程序的(官方推荐)首选方法. 当浏览器下载完一个页面的时候就开始渲染(翻译)HTML标签,然后执行css.js代码,在执行js代 ...
- 自定义Image自动切换图像控件
做这么一个控件,图片自动切换,形成动画效果. 随便的码码,码完发现东西太少了,不过还算完善. public class MyPictureBox : PictureBox { Timer timer ...
- Android后台保活实践总结:即时通讯应用无法根治的“顽疾”
前言 Android进程和Service的保活,是困扰Android开发人员的一大顽疾.因涉及到省电和内存管理策略,各厂商基于自家的理解,在自已ROOM发布于都对标准Android发行版作为或多或少的 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 关于Ubuntu运行级别、开机启动脚本的说明
关于Ubuntu运行级别.开机启动脚本的说明 目录简介 1.1介绍Ubuntu下面的自启动脚本目录 1.2 Linux操作系统运行级别的概念 1.3关于操作系统自启脚本的启动顺序 1.4 Lin ...