zoukankan      html  css  js  c++  java
  • 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">&nbsp;接受&nbsp;</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">&nbsp;拒绝&nbsp;</span>
            </a>
            审核留言:
            <input type="text" name="message" style="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,如果缩放之后,系统还是维持原来的字体大小,整个字体在渲染的时候进行放大处理

  • 相关阅读:
    第十六天
    第十五天
    STM8L段式液晶驱动器
    STM8L的LCD接口详解及驱动程序
    作为合格的工程师,这些电路图一辈子都得记住!
    双向晶闸管触发电路工作原理图
    3~15伏10A大电流可调稳压电源
    用TL431制作简单充电器电路
    5V USB充电器电路图
    555
  • 原文地址:https://www.cnblogs.com/TextEditor/p/5459485.html
Copyright © 2011-2022 走看看