MVC開發經驗總結

網站開發中技術問題的筆記

如下經驗基於 MVC 5.2.3

Javascript

BUG思考

  • 200 OK真的表示沒有問題嗎?
    有時候Status 200做爲WebAPI的返回值,並不表示真的OK,例如取得一個文件,沒有取到,可是返回值也會是200。
    200只是表示一個WebAPI執行完畢,沒有異常而已,並不表示確定成功。javascript

  • IIS7.0 上傳文件失敗,返回404。
    乍一看是資源沒法找到,實際上是設定問題,上傳文件的最大長度限制,還須要下面這樣的配置。
    maxRequestLength不少文章都提到了,maxAllowedContentLength則不少文章沒有提到。css

<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目錄下面,致使如下這樣的問題html

未能加載文件或程序集「Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35」或它的某一個依賴項。系統找不到指定的文件。

因此通常建議在使用ReSharp以前將項目進行CheckIn,若是出現特殊狀況則執行Redo便可。
(具體配置文件:packages.config)java

<?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版本react

string strArticalID = context.Request.Unvalidated.Form["ArticalID"];

Debug版本的時候,VS沒法察看不少變量的值,例如Ajax調用ASHX

若是出現多個控制器的時候,多是由於你的BIN目錄沒有刪除乾淨,有一個過時的,之前版本的DLL致使的

Asp.net MVC在運行的時候,會將全部Bin下面的DLL進行解析,若是有一箇舊的DLL,例如是更名前的DLL殘留在Bin目錄中,則會出現多個同名控制器的問題。(在VS中怎麼檢查都不會發現這個問題的!)jquery

如何設定啓動Areas?

參見RouteConfig的編寫,這裏能夠指定默認的Area,寫法必須嚴格按照例子.
Home_Default這個路由名字不要使用(可能系統會默認註冊這個名字)
(錯誤信息:路由集合中已存在名爲「Home_default」的路由。路由名稱必須惟一。)css3

View的Layout

若是不指定Layout,默認使用 Views/Shared/_Layout(_ViewStart.cshtml)git

相似於React的組件,可使用DisplayFor來顯示組件

組件放在Shared/DisplayTemplate/ 下面github

px 不能省略,RenderBody() 須要CSS3規範的Style

<!DOCTYPE html> 加上去的話,類名稱必須區分大小寫,寫錯則不能識別

這是個瀏覽器兼容性的話題。有時候你會發現HTML的Class名稱大小寫寫錯了,樣式也會生效,這是由於你沒有加上 DOCTYPE 這個TAG。若是加上以後,則類名稱不容許忽略大小寫。web

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="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,若是縮放以後,系統仍是維持原來的字體大小,整個字體在渲染的時候進行放大處理

相關文章
相關標籤/搜索