首先,開啟 ./node_modules/karma-chrome-launcher/index.js
接著修改其路徑為chrome安裝之路徑,如下圖(chrome預設路徑)
重新執行 grunt test,搞定!!~^^
這是上星期五幫客戶安裝 HP 伺服器後,要安裝SQL時發生的錯誤,因為來不及卡圖! 所以這邊就做個簡易分享,除了做個紀錄之外也希望若網友有遇到類似問題的話,可以少走一點冤枉路嚕。
當您使用HP 官方的 SmartStart 安裝伺服器OS之後,要安裝SQL 時就會發生這一錯誤,原因是因為HP的 SmartStart 一開始並沒有繁體中文選項可選,因此預設會將"地區及語言→系統管理→非Unicode程式的語言,設定為英文"!!
而預設的英文語系在登錄檔中的『效能計數器登錄區』是在 009 這個目錄中,而當你裝好繁中OS之後,卻是要走0404 目錄,因此就會造成這個結果。
英文語系 :
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]
繁中語系:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\0404]
解法有三種!!!
1.不要透過 HP 的 SmartStart 去安裝OS,直接從OS的安裝片去安裝!!
OS: 很麻煩阿,還要重裝,真是浪費生命,而且其他相對應的驅動、磁碟陣列卡還要另外裝!!超麻煩,有沒更好解法呢?請看第二種方式!! 嘿嘿....
2.控制台→地區及時間→系統管理,修改"非Unicode程式的語言"為繁體中文。然後重開機,系統就會將效能計數器資訊寫入0404 ,再安裝SQL2008~~搞定!!
OS:還要重開機很麻煩...........我是懶人有沒有更好方法? 有的....
3.將 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\CurrentLanguage] 匯出,
再使用記事本開啟修改路徑為0404,接著再對這修改過的登錄檔按兩下註冊,接著就能快樂繼續安裝 SQL 2008 嚕。
打完收工,希望有朝一日,這篇能幫助到其他一樣被HP Server 困擾的IT人員。
上一篇,已經針對 Action Filter 作了一個初步的介紹,這篇就來試著實作自己的Action Filter。
Action Filter 是實作 一個繼承 ActionFilterAttribute 的一個 Attribute 類別, ActionFilterAttribute 是一個抽象類別,包含四個 virtual methods : OnActionExecuting、OnActionExecuted、OnResultExecuting、OnResultExecuted。
這邊是MSDN的原文說明,相信會讓大家有更清楚的認知:
首先我們先建立一個 MVC 專案,並新增一個Filter資料夾,然後在其中新增一個繼承 ActionFilterAttribute 的 Trace class ,並 override ActionFilterAttribute 的四個 virtual methods :
public class Trace : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("OnActionExecuting");
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("OnActionExecuted");
base.OnActionExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Debug.WriteLine("OnResultExecuting");
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Debug.WriteLine("OnResultExecuted");
base.OnResultExecuted(filterContext);
}
}
接著,按下F5讓它動起來,觀察執行的先後順序是否如同上面所描述的一樣 :
那如果 Action Filter 套用多個呢? 首先我們再新增一個 ActionFilter (Log) :
public class Trace : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("OnActionExecuting from Trace");
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("OnActionExecuted from Trace");
base.OnActionExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Debug.WriteLine("OnResultExecuting from Trace");
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Debug.WriteLine("OnResultExecuted from Trace");
base.OnResultExecuted(filterContext);
}
}
public class Log : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("OnActionExecuting from Log");
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("OnActionExecuted from Log");
base.OnActionExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Debug.WriteLine("OnResultExecuting from Log");
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Debug.WriteLine("OnResultExecuted from Log");
base.OnResultExecuted(filterContext);
}
}
將 Trace、Log 兩個 Filter 都套用到 Action之後,我們會得到以下的結果
從上面的結果我們可以發現 Action Filter 中的 Executing 是由上而下執行,而 Executed 是由下而上執行,類似堆疊 "後進先出"的概念。
ActionExecuting、ResultExcuting 執行階段是可以被終止、Cancel 的(例如當發生execption時),所以我們再把 Trace 這個 Filter 修改一下,使其拋出一個 non-null Result,來模擬這個狀況
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("OnActionExecuting from Trace");
//加入下面這一行,讓result 為 non-null
//也就是 filterContext.RouteData.Values.ContainsValue("Cancel") = true
filterContext.Result = new EmptyResult();
base.OnActionExecuting(filterContext);
}
我們會得到以下的結果 :
可以發現,當Trace 的 OnActionExecuting 事件被中止,尚未執行的Log OnActionExecuting 也一樣被中止,直接進入OnResultExecuting 繼續執行,由此可知 OnActionExecuting 和 OnResultExecuting 兩個是獨立的流程,並不會因為 OnActionExecuting 發生Cancel 而影響 OnResultExecuting 。
參考資料 :
restore DATABASE xxxx -- 指定 欲還原的資料庫名稱db from disk='D:\DbBack\xxxx.bak' -- 設定 資料庫備份檔 .bak 路徑 with move 'xxxx' to 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Data\xxxx.mdf', -- 設定成 MSSQL資料庫存放路徑 (mdf) move 'xxxx_Log' to 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Data\xxxx_log.ldf' -- 設定Log 存放路徑 ,NoRecovery ,Replace go
過濾器類型 | 中文名稱 | 介面 | 實作 |
Authorization Filters | 授權過濾器 | IAuthorizationFilter | AuthorizeAttribute ChildActionOnlyAttribute RequireHttpsAttribute ValidateAntiForgeryTokenAttribute ValidateInputAttribute |
Action Filters | 動作過濾器 | IActionFilter | ActionFilterAttribute OutputCacheAttribute AsyncTimeoutAttribute |
Result Filters | 結果過濾器 | IResultFilter | ActionFilterAttribute |
Exception Filters | 例外過濾器 | IExceptionFilter | HandleErrorAttribute OutputCacheAttribute |
(圖片引用自http://www.dotnetexpertguide.com)
[HandleError] //加在Action 之上 public ActionResult Contact() { ViewBag.Message = "Your contact page."; return View(); }
[HandleError] //套用整個Controller public class HomeController : Controller { public ActionResult Index() { ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application."; return View(); } }
//在App_Start中的FilterConfig中註冊filter public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } }
protected virtual FileContentResult File(byte[] fileContents, string contentType, string fileDownloadName);
protected virtual FilePathResult File(string fileName, string contentType, string fileDownloadName);
protected virtual FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName);
public FileContentResult fileContextResult(int productId = 2) { var prod = db.Products.FirstOrDefault(q => q.ProductID == productId); return prod != null ? File(prod.ImageData, prod.ImageMimeType) : null; }
public FilePathResult filePathResult() { ViewBag.Status = "FilePathResult"; string path = Server.MapPath("/Content/Guns/2.png"); return File(path, "image/png", "02.png"); }
public FileStreamResult fileStreamResult() { string path = Server.MapPath("/Content/Guns/2.png"); var image = new Bitmap(path); MemoryStream stream = new MemoryStream(); image.Save(stream, ImageFormat.Jpeg); stream.Seek(0, SeekOrigin.Begin); return File(stream, "image/jpeg"); }
@ViewBag.Status
@Html.ActionLink("Download", "filePathResult")
[HttpPost] public ActionResult Edit(Product product, HttpPostedFileBase image) { // 注意這邊須使用 HttpPostedFileBase 來接 multipart/form-data 格式的資料 if (ModelState.IsValid) { if (image != null) { product.ImageMimeType = image.ContentType; product.ImageData = new byte[image.ContentLength]; image.InputStream.Read(product.ImageData, 0, image.ContentLength); } db.SaveProduct(product); TempData["message"] = string.Format("{0} has been saved", product.Name); return RedirectToAction("Index"); } return View(product); }
@using (Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype= "multipart/form-data" })) { @Html.EditorForModel();Image@if (Model.ImageData == null) {} else {
}
Upload new File@Html.ActionLink("Cancel", "Index") }
public ActionResult Index() { ViewData["message"] = "訊息"; return View(); }View :
@ViewData["message"]2.ViewBag
public ActionResult Index() { ViewBag.message = "訊息"; return View(); }View :
@ViewBag.message3.Temp Data
public ActionResult Index() { TempData["status"] = "我是從index送過來的!"; return RedirectToAction("about"); } public ActionResult about() { return View(); }View :
我們在Index Action 中使用了 RedirectToAction("about"),最後回傳 about.cshtml 這個ViewTempData :
@TempData["status"]