C50108
  • 2019/0801/轉職成功路途開始
  • 自學心得與此網站使用方式
  • 行事曆&課程大綱
  • 2019/0224/自我檢視
  • 雜記
    • 2019/0103/雜記
    • 2019/0410/作品集建構
    • 2019/0429/職訓局書單
    • 2019/0317/自我檢視
    • 2019/0316/陪玄松去高車討論&環境圖流程圖大神們line討論
    • 2019/0305/Gitbook使用方法
  • 2018/10XX/轉職心路歷程
  • 職訓局里程碑
    • 201901
      • 2019/0103/行動商務系統設計與開發,職訓局報到
      • 2019/0104/正式開課日&行動商務課程簡介
      • 2019/0108/資料庫理論/Access&WEB開發簡介
      • 2019/0109/資料庫資料型態屬性&HTMLtag
      • 2019/0110/計概基礎概念
      • 2019/0111/HTML表格table&form表單_post/get&iframe
      • 2019/0114/計&網概概念&網路層概念
      • 2019/0115/資料庫Access運算值&CSS簡介&在職班補充
      • 2019/0116/Access比較/邏輯運算&CSS_在職班補充+選擇器+Box model
      • 2019/0117/資訊系統架構&網路層
      • 2019/0118/資料庫正規化
      • 2019/0121/計概IT分工&資料庫正規化
      • 2019/0122/網路層&CSS父子容器切版
      • 2019/0123/Access資料庫關聯&CSS position&偵錯
      • 2019/0124/C#宣告、指定運算子
      • 2019/0125/VM虛擬機_基礎介紹
      • 2019/0128/VM虛擬機架設_虛擬網卡設定&伺服器權限設置
      • 2019/0129/Wireshark查詢網路層&資料庫物件導向
      • 2019/0130/ERmod雞爪圖&C#if、for時間複雜度
      • 2019/0131/C#流程控制&變數型別
    • 201902
      • 2019/0201/系統分析與設計_資料庫ERmod&c#Homework
      • 2019/0211/ASP.NET_Webforms&物件命名空間
      • 2019/0212/定址&網路遮罩
      • 2019/0213/SQLSeverM.S.介紹&AspWebforms表單控制項
      • 2019/0214/網概乙太網路&網路安全
      • 2019/0215/Pre Javascript 基礎 & 在職班補充
      • 2019/0218/TSQL基本指令&ASP.net左右置換表格/驗證傳值
      • 2019/0219/Javascript終極密碼&musicplay&asp.net驗證器
      • 2019/0220/SS基本語法&網概line機器人
      • 2019/0221/前端Javascript musicplay、內聚力耦合率
      • 2019/0222/前端Javascript musicplay、內聚力耦合率&伺服器權限
      • 2019/0223/SqlServerHomework&第一次專案報告
      • 2019/0225/SS合併查詢&ASP.NET驗證器
      • 2019/0226/伺服器ntfs安全性權限/共用權限
      • 2019/0227/Javascript_music_play_end&ASP.net串聯SQL(datasource就是拿來串SQLServer的)
    • 201903
      • 2019/0304/SS集合運算/子查詢/exists&asp.net GridView 事件 OnRowDataBound
      • 2019/0305/SS查詢式end&ASP.NET_Gridview_自訂樣式分頁
      • 2019/0306/Javascript musicplay_really_end
      • 2019/0307/前端HTML5鑲嵌字型&伺服器網域概念
      • 2019/0308/Android Studio_基礎概念&開發環境建置
      • 2019/0311/胡中興 工業4.0講習
      • 2019/0312/安卓系統_開發基礎介紹
      • 2019/0313/安卓工作室_基礎/布局內元件
      • 2019/0314/Asp.net鏈結資料庫-查詢
      • 2019/0315/SQS DML&第二次專案報告
      • 2019/0318/SQL DDL & 伺服器 自學基礎
      • 2019/0319/Android Studio_布局內元件&佈局規劃元件
      • 2019/0320/SQL檢視表&tsql基礎&Asp.net_Gridview
      • 2019/0321/TSQL&TDM&ASP.NET_Datalist
      • 2019/0322/DOM&JQ基礎&系統分析設計PPT&在職班補充
      • 2019/0325/TMD&Asp.net上傳圖片/產生QRCode
      • 2019/0326/SQLServer_預存程序+函數&Asp.net_Webforms半自動鏈結資料庫與自動化更新
      • 2019/0327/安卓工作室_佈局規劃元件
      • 2019/0328/jQuery選擇器應用&Ajax導讀+應用&asp.net串sserver_註冊帳號功能
      • 2019/0329/ADDS伺服器架設&第三次專題報告
    • 201904
      • 2019/0401/SQL觸發程序&Asp.net自動寄信&認證信
      • 2019/0402/前端作業四-jQ應用轉換樣式&ASP.NET_FormView控制項-會員資料維護實例
      • 2019/0403/JQ事件動畫&股市&Usecase
      • 2019/0408/安卓工作室_元件/布局基本end
      • 2019/0409/安卓工作室-物件導向事件驅動實作+Homework1&2
      • 2019/0410/上午小組討論-作品集自習&Visual studio webform+MVC範本
      • 2019/0411/安卓工作室-UI觸發委派函式與控制物件
      • 2019/0412/JQ動畫實做(寶可夢遊戲開場)&第四次專題報告
      • 2019/0415/前端JQ-Ajax+JSON&後端ADO建置、主板頁面概念控制項、Bootstrap演示
      • 2019/0416/安卓工作室UI控件案例結束、IDE Eclipse_Java物件導向基礎
      • 2019/0417/伺服器網域ADDNS&416LINE討論
      • 2019/0418/SQL指標、索引&Use cace
      • 2019/0419/主頁、Webform ADO.NET Entity Fromwork 增刪修實作&第五次專題報告
      • 2019/0423/Java基礎(型別/溢位/自動強制型別轉換/鑄造物件/串流/)&I/O物件用法(底層/較不底層)
      • 2019/0424/Bootstrap_RWD基礎/應用&Asp.Net_MVC實作增刪修(修待補)
      • 2019/0425/伺服器IIS安裝&資料匯入與管理
      • 2019/0426/Asp.Net_MVC增刪修實作(補修)&bootstrap – gridsystem– 網格系統&第六次專題報告&全國技能競賽網頁設計
      • 2019/0429/物件導向技術原理方法實作
      • 2019/0430/資料庫設計應用效能調教_SQL all end&ASP.NET_MVC_Controller單元_純C無V無M操作/簡單複雜繫結
    • 201905
      • 2019/0501/內部網站辨識&外部DNS域名/IP+自架DNS伺服器理解
      • 2019/0502/Java語言基礎、物件導向基礎
      • 2019/0503/Asp.net泛型處理常式驗證圖片應用&第七次專題報告Usecase
      • 2017/0506/Bs_FlexBox&Asp.Net_MVC_View+Razor@+Viewbag+helper
      • 2019/0507/Java 物件導向_類別+函式觀念&階段性作業三
      • 2019/0508/Asp.Net_MVC_Model_ADO.NET+Entityframework+LoginMember實作+MVC觀念
      • 2019/0509/Java物件導向(函式)_儲存型態+回傳值+多載+自制+例外處理+this參照+存取+複合
      • 20919/0510/第八次專題報告=功能DEMO
      • 2019/0514/Java_靜態類別+繼承特性
      • 2019/0515/RWD Utility+Card&MVC ViewModel+CRUD(RD)
      • 2019/0516/BS form&驗證+JQ驗證 & MVC_CRUD(CU)
      • 2019/0517/ASP.NET Webform介紹Master page 主頁 & Session 簡介 & 登入login驗證 & 隱碼攻擊injection & 工具箱程式碼片段使用
      • 2019/0520/繼承&存取權特性+java作業四+字符串格式化+多形+抽象類別
      • 2019/0521/抽象類別+介面
      • 2019/0522/Bootstrap Components 元件介紹 + MVC API 概念&實作
      • 2019/0523/IIS IP限制&ASP.NET部屬
      • 2019/0524/WebApi異質程式連線方式&第九次專題報告_循序圖
      • 2019/0528/Bootstrap Components 元件介紹 + MVC 登入驗證 + 商品加入購物車 實作
      • 2019/0529/ASP.NET_MVC購物車訂單功能完成+BootstrapComponents元件介紹
      • 2019/0530/原本是伺服器的課,但拿來做專題。
      • 2019/0531/ASP.NET_WebformAllView物件功能清單&ListView實作&第十次專案報告(完整循序圖)
    • 201906
      • 2019/0603/Bootstrap Components RWD End + ASP.NET_MVC Part2 PhotoSharing CodeFirst & Model 驗證
      • 2019/0604/ASP.NET_MVC Part2 PhotoSharing Controller & Filter & ADO.NET & View@RAZOR Helper
      • 2019/0605/Java介面實作&結束+安卓工作室(整合Layout與Java)Intent意圖&Bundle包裹
      • 2019/0606/第十一次專案報告功能demo+SingnaIR+伺服器作業+端午歌唱比賽
      • 2019/0609/黃大神傳授Visual_Studio&除錯技巧
      • 2019/0610/番外篇 Web Socket 即時連線& 就業前準備與技巧
      • 2019/0611/安卓工作室_(意圖+隱含意圖)資料傳遞+Android生命週期+硬體裝置與應用
      • 2019/0612/WebSockets Notification + MVC Part2 PhotoSharing PartialView & ADO.NET & EntitySQL & VMd
      • 2019/0613/MVC Part2 PhotoSharing ViewModel & ErrorHandle
      • 2019/0614/第十二次專案報告 功能Demo
      • 2019/0618/MVC Part2 PhotoSharing Route & Sitemap & _LayOut & AJAX
      • 2019/0618/RWD在職班_(Javascript_object-oriented programming)
      • 2019/0619/安卓工作室_(硬體裝置與應用)相機操作&GPS+階段性作業6+延伸 ( APP End )
      • 2019/0620/MVC補充C#MS SQL匯入CSV+上傳CSV存入MS SQL
      • 2019/0621/第十三次專案報告 功能Demo
    • 2019/0701/最終專案報告
    • 2019/0702/結訓與家人遊台東預計0708開始找工作自學筆記應該會等工作穩定後繼續開始
  • 自學里程碑
    • 201901
      • 2019/0107/DR
      • 2019/0108/UW
      • 2019/0103/Git
      • 2019/0103/CS
      • 2019/0115/Vscode
      • 2019/0116/JSON&AJAX
      • 2019/0122/卡內基
      • 2019/0126/MBTI
      • 2019/0131/PDP 外在 內在
    • 201902
      • 2019/0217/huli_half Developer
      • 2019/0219/SEO
      • 2019/0219/雪球速讀法
    • 201903
      • 2019/0304/asp、php、jsp、asp.net、net. Framework、asp.net core
      • 2019/0329/網站架站初嘗試
    • 201904
      • 2019/0415/Datatype-Explanation
      • 2019/0416/ASP.NET_Webform&Core&MVC(MVVM/MVP)
    • 201905
      • 2019/0613/開發職訓局共同專案時遇到的問題與解法
      • 2019/0514/ASP.NET SignalR
      • 2019/0514/JS擴展-JQ、React、Vue、Angular...
      • 2019/0514/Sass&Scss
      • 2019/0514/MVC結合Webform
      • 2019/0515/ASP.NET MVC_TempData/ViewData/ViewBag
      • 2019/0522/[自學筆記]海綿體啟蒙??
Powered by GitBook
On this page
  • #接續07_ViewModel
  • #08_ErrorHandle 錯誤處理機制
  • RemoteOnly 遠端自訂錯誤 近端系統錯誤
  • 自訂開發人員例外錯誤訊息
  • 自訂400系列錯誤訊息
  • ##不同層級去阻擋跑出錯誤訊息
  • ##那如果要讓兩個錯誤不同錯誤頁面那該怎辦 ?

Was this helpful?

  1. 職訓局里程碑
  2. 201906

2019/0613/MVC Part2 PhotoSharing ViewModel & ErrorHandle

#接續07_ViewModel

寫完CreateComment 與 delete

符合UX 調整 View 跟 controller

### 老師步驟

//step 4 建立討論主題與回覆功能
//step 4.1 建立CreateComment Action(Get及Post)
//step 4.2 建立CreateComment View(Empty-Without Model)
//step 4.3 在CreateComment View建立回覆表單
//step 4.4 在CreateComment View建立"回討論主題列表" ActionLink
//step 4.5 在Index View建立"回覆" ActionLink
//step 4.6 在Display View建立"回覆" ActionLink
//step 4.7 將CreateComment Action加入mode參數
//step 4.8 將"回覆" ActionLink加入mode參數(Index View)
//step 4.9 改寫CreateComment Action return時的判斷
//step 4.10 測試

//step 5 建立刪除回覆功能
//step 5.1 建立Delete Action
//step 5.2 在Index View建立"刪除" ActionLink
//step 5.3 在Display View建立"刪除" ActionLink
//step 5.4 測試

###ViewModel/Controllers/VMPhotoCommentsController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Net;
using PhotoSharing.DB_EntitySQL.Models;

namespace PhotoSharing.ViewModel.Controllers
{
    //step 1.4 建立VMPhotoCommentsController
    public class VMPhotoCommentsController : Controller
    {
        PhotoSharingEntities db = new PhotoSharingEntities();

        // GET: VMPhotoComments
        //step 2.1 建立Index Action
        public ActionResult Index(int id=1)
        {
            PhotoComments pc = new PhotoComments()
            {
                photos = db.Photos.ToList(),
                comments = db.Comments.Where(p => p.PhotoID == id).ToList()
            };

            ViewBag.PID = id;
            ViewBag.PTitle = db.Photos.Where(p => p.PhotoID == id).FirstOrDefault().Title;


            return View(pc);
        }

        //step 3.1 建立Display Action
        public ActionResult Display(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }


            PhotoComments pc = new PhotoComments()
            {
                photos = db.Photos.Where(p => p.PhotoID == id).ToList(),
                comments = db.Comments.Where(p => p.PhotoID == id).ToList()
            };

            ViewBag.PID = id;
            //ViewBag.PTitle = db.Photos.Where(p => p.PhotoID == id).FirstOrDefault().Title;


            return View(pc);
        }

        //step 4.1 建立CreateComment Action(Get及Post)
        //step 4.7 將CreateComment Action加入mode參數
        public ActionResult CreateComment(int? id, int mode)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            ViewBag.PhotoID = id;
            ViewBag.Mode = mode;
            return View();
        }
        //step 4.1 建立CreateComment Action(Get及Post)
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult CreateComment(Comments comment,int mode)
        {
            db.Comments.Add(comment);
            db.SaveChanges();

            //step 4.9 改寫CreateComment Action 口eturn時的判斷
            if (mode == 2)
                return RedirectToAction("Display", new { id = comment.PhotoID });

            return RedirectToAction("Index",new{id=comment.PhotoID });
        }


    }
}

###Views/VMPhotoComments/Index.cshtml

@*//step 2.2 建立Index View(Empty-Without Model)*@
@model PhotoSharing.ViewModel.PhotoComments

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<div class="row">
    <div class="col-xs-3">
        @*//step 2.3 建立討論主題列表*@
        <h4>討論主題列表</h4>
        @foreach (var item in Model.photos)
        {
            <h4>@Html.ActionLink(item.PhotoID + "." + item.Title, "Index", new { id = item.PhotoID })</h4>
        }
    </div>
    <div class="col-xs-9">
        @*//step 2.4 建立回覆列表*@
        <h2>@ViewBag.PTitle</h2>
        @if (Model.comments.Count == 0)
        {
            <h4>尚無任何回覆</h4>
            <p>
                @*//step 4.5 在Index View建立"回覆" ActionLink*@
                @*//step 4.8 將"回覆" ActionLink加入mode參數(Index與Display View)*@
                @Html.ActionLink("回覆留言", "CreateComment", new { id = ViewBag.PID, mode = 1 })

            </p>
        }
        else
        {
            <p>
                @*//step 4.5 在Index View建立"回覆" ActionLink*@
                @*//step 4.8 將"回覆" ActionLink加入mode參數(Index與Display View)*@
                @Html.ActionLink("回覆留言", "CreateComment", new { id = ViewBag.PID, mode = 1 }) |
                @*//step 3.5 在Index View建立"詳細資料" ActionLink*@
                @Html.ActionLink("詳細資料", "Display", new { id = ViewBag.PID })
            </p>


            <table class="table">
                <tr>

                    <th>
                        Subject
                    </th>
                    <th>
                        Body
                    </th>
                    <th>
                        UserName
                    </th>
                </tr>

                @foreach (var item in Model.comments)
                {
                    <tr>
                        <td>
                            @item.Subject

                        </td>
                        <td>
                            @item.Body

                        </td>
                        <td>
                            @item.UserName

                        </td>

                    </tr>

                }
            </table>
        }
    </div>
</div>


@*@Html.ActionLink("Edit", "Edit", new { id = item.CommentID }) |
    @Html.ActionLink("Details", "Details", new { id = item.CommentID }) |
    @Html.ActionLink("Delete", "Delete", new { id = item.CommentID })*@

###Views/VMPhotoComments/Display.cshtml

@*//step 3.2 建立Display View(Empty-Without Model)*@
@model PhotoSharing.ViewModel.PhotoComments
@{
    ViewBag.Title = "Display";
}

@*//step 3.3 建立討論主題顯示區*@
<div class="row well">
    <div class="col-xs-12">
        <h2>@Model.photos[0].Title</h2>
        <p>@Model.photos[0].Description</p>
        <p>建立人:@Model.photos[0].UserName</p>
        <p>建立日期:@Model.photos[0].CreatedDate</p>
        @*//step 4.6 在Display View建立"回覆" ActionLink*@
        <p class="text-right">
            @Html.ActionLink("回覆", "CreateComment", new { id = ViewBag.PID, mode = 2 })
        </p>

    </div>
</div>
<hr />
@*//step 3.4 建立回覆列表顯示區*@
<div class="row">
    <div class="col-lg-offset-2 col-xs-8">
        @if (Model.comments.Count == 0)
        {
            <h4>尚無任何回覆</h4>

        }
        else
        {
            foreach (var item in Model.comments)
            {
                <div class="row table-bordered">
                    <div class="col-xs-12">
                        <h3>@item.Subject</h3>
                        <p>@item.Body</p>
                        <p class="text-right">建立人:@item.UserName</p>

                    </div>
                </div>
                <hr />
            }
        }
    </div>
</div>
@*//step 3.6 在Display View建立"回討論主題列表" ActionLink*@
@Html.ActionLink("回留言列表", "Index", new { id = ViewBag.PID })

###Views/VMPhotoComments/CreateComment.cshtml

@{
    ViewBag.Title = "CreateComment";
}

<h2>回覆留言</h2>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();
    <p>
        <label for="Subject">回覆主題:</label>
        <input id="Subject" name="Subject" type="text" />
    </p>

    <p>
        <label for="Body">回覆內容:</label>
        <textarea id="Body" name="Body" rows="5" cols="30"></textarea>

    </p>
    <p>
        <label for="UserName">回覆人名稱:</label>
        <input id="UserName" name="UserName" type="text" />
    </p>

    <input id="PhotoID" name="PhotoID" type="hidden" value="@ViewBag.PhotoID" />
    <input id="mode" name="mode" type="hidden" value="@ViewBag.Mode" />

    <p>
        <input id="Submit1" type="submit" value="確定送出" class="btn btn-default" />
    </p>


}

#08_ErrorHandle 錯誤處理機制

###老師步驟


//4.1建立ExceptionDemo Action引發錯誤
//4.2替ExceptionDemo Action建立View並測試
//4.3在Web.Config啟用自訂錯誤 <customErrors mode = "On" />
//4.4再測試一次ExceptionDemo View(會把錯誤導向Error.cshtml)

//4.5 建立SlideShow Action並自訂NotImplementedException錯誤
//4.6 替SlideShow Action建立View並測試(仍會把錯誤導向Error.cshtml)

//4.7 在Shared目錄建立ExceptionError View
//    在ExceptionError.cshtml使用System.Web.Mvc.HandleErrorInfo 取出ControllerName,ActionName及Exception.Message屬性

//4.8 在global.asax註冊使用GlobalFilterCollection(Web Application層級)
//4.8-1其實在FilterConfig.cs裡已經被註冊使用GlobalFilterCollection,因此預預都會導到Error.cshtml
//在global.asax裡若把GlobalFilters.Filters.Add(new HandleErrorAttribute() { View = "ExceptionError" })
//寫法GlobalFilterCollection之前,則會用GlobalFilterCollection,若寫在之後,則會用
//GlobalFilters.Filters.Add(new HandleErrorAttribute() { View = "ExceptionError" })

//4.9 改寫在Shared目錄裡的Error View(已存在,可直接修改內容)
//4.9-1 在Error.cshtml使用System.Web.Mvc.HandleErrorInfo 取出ControllerName,ActionName及Exception.Message屬性
//4.9-2 使用System.Web.Mvc.HandleErrorInfo
//      @model System.Web.Mvc.HandleErrorInfo
//4.9-3取出ControllerName,ActionName及Exception.Message屬性*@
//      <fieldset>
//          <legend>HandleErrorInfo</legend>
//           Controller: @Model.ControllerName<br />
//           Action: @Model.ActionName<br />
//           Message: @Model.Exception.Message
//      </fieldset>


//4.10 在PhotoController加入 [HandleError(View = "Error")]屬性(Controller層級,會覆蓋Global層級)
// 若只加[HandleError],沒指定View的話,不管Global設定什麼,都會導到預設

//4.11 在Web.config設計400與404錯誤的重新導向

//<httpErrors errorMode = "Custom" >
//     <remove statusCode="400"/>
//     <remove statusCode = "404" />

//     <error statusCode="400" path="/400.html" responseMode="ExecuteURL"/>
//     <error statusCode = "404" path="/404.html" responseMode="ExecuteURL"/>
//</httpErrors>

400錯誤 還沒到 通訊端就處理掉了 IIS處理

Webconfig 如果沒有設定組態就會繼承 IIS處理機制

還有別種類型的 如 發生例外

好的網站不能讓USER看到系統錯誤

接著我們要來自訂錯誤

首先要到 Webconfig 啟用自訂錯誤

<cutomErrors mode=”RemoteOnly”

RemoteOnly 遠端自訂錯誤 近端系統錯誤

###Webconfig

<?xml version="1.0" encoding="utf-8"?>
<!--
  如需如何設定 ASP.NET 應用程式的詳細資訊,請瀏覽
  https://go.microsoft.com/fwlink/?LinkId=301880
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="ConnectionString" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\PhotoSharing.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
  <add name="PhotoSharingEntities" connectionString="metadata=res://*/DB_EntitySQL.Models.PhotoComments.csdl|res://*/DB_EntitySQL.Models.PhotoComments.ssdl|res://*/DB_EntitySQL.Models.PhotoComments.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(LocalDB)\MSSQLLocalDB;attachdbfilename=|DataDirectory|\PhotoSharing.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /></connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
    </httpModules>
    <!--//4.3在Web.Config啟用自訂錯誤-->
    <customErrors mode="On">
    
    </customErrors>
    
  </system.web>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" />
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.2.1" newVersion="4.0.2.1" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-5.2.4.0" newVersion="5.2.4.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.webServer>
    <!--//4.11 在Web.config設計400與404錯誤的重新導向-->
    <httpErrors errorMode="Custom">
      <remove statusCode="404" />
      <remove statusCode="400" />
      <error statusCode="404" path="404.html" />
      <error statusCode="400" path="404.html" />
    </httpErrors>

    <modules>
      <remove name="TelemetryCorrelationHttpModule" />
      <add name="TelemetryCorrelationHttpModule" type="Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation" preCondition="integratedMode,managedHandler" />
      <remove name="ApplicationInsightsWebTracking" />
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
    </modules>
    <validation validateIntegratedModeConfiguration="false" />
  </system.webServer>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

寫一個正式的控制

首先 先寫一個會觸發錯誤的acction

PhotosController.cs -> ExceptionDemo()

###Controllers/PhontosController.cs

 //4.1建立ExceptionDemo Action引發錯誤
        //[HandleError(View="ExceptionError")]
        public ActionResult ExceptionDemo()
        {
            int i = 0;

            int j = 10 / i;

            return View();
        }
        //4.5建立SlideShow Action並自訂NotImplementedException錯誤
        [HandleError(View="ExceptionError")]
        public ActionResult SliderShow()
        {
            throw new NotImplementedException("這一個SliderShow的功能還沒有做好哦!!!");
        }

接著講解了一下運作方式(錯誤機制的觸發) 等等會實際更改

Global.asax.cs

Filters.webconfig

自訂開發人員例外錯誤訊息

先寫 Error.cshtml

###Views/Shared/Error.cshtml

@*<!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <meta name="viewport" content="width=device-width" />
        <title>忙碌中</title>
    </head>
    <body>
        <hgroup>
            <h1>伺服器忙碌中...</h1>
            <h2>伺服器忙碌中,請稍後再試。</h2>
        </hgroup>
    </body>
    </html>*@

@model System.Web.Mvc.HandleErrorInfo

@{

}

<h1>伺服器忙碌中...</h1>
<h2>伺服器忙碌中,請稍後再試。</h2>
<fieldset>
    <legend>錯誤資訊</legend>
    ControllerName:@Model.ControllerName<br />
    ActionName:@Model.ActionName<br />
    Exception:@Model.Exception.GetType().ToString()<br />
    Message:@Model.Exception.Message<br />
</fieldset>

帶值近來讓開發人員看得值

要帶一個 model System.Web.Mvc.HandleErrorInfo

才能帶到錯誤訊息

但通常這個不能給人看到

自訂400系列錯誤訊息

所以改成有兩頁預設頁 ( 2 error

ExceptionError.cshtml

###Views/Shared/ExceptionError.cshtml

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "ExceptionError";
}

<h1>Message:@Model.Exception.Message</h1>

要去修改 filterConfig.cs

結果好像沒更改 = = ??

##不同層級去阻擋跑出錯誤訊息

例如去

Global.asax.cs 伺服器層級的組態定義

Habdleerrorattribute view = ???

這樣就會在這邊先導到新的那頁錯誤

Global.asax.cs

Filterconfig

都有寫的時候 ( 都有註冊時

會以 filterconfig 為主 類似 css 層級 越精緻 且 執行的時間後面

##那如果要讓兩個錯誤不同錯誤頁面那該怎辦 ?

註冊成 controller 或 action 層級的 即可

所以到 controller 裡面 的action[handleerror(view=”視圖名稱”)]

大部分頁面都要 就註冊 filterconfig

少數的 就註冊 action 層級的

整個 controller 的就寫在 controller 正向負向表列

接著新增了一個 httperror.cshtml

###Views/Shared/HttpError.cshtml

@{
    ViewBag.Title = "HttpError";
}


<video id="v" controls="controls" style="width:1000px;" autoplay="autoplay">
    <source src="~/Images/404.mp4" type="video/mp4" />
</video>
<script>
    var v = document.getElementById("v");
    v.play();
</script>

伺服器層級的錯誤400系列 一定要定義在 web.config

剛剛的問題 站食用根目錄的就好 找不出來

步驟在 photoscontroller

忘記這天的狀況,因為晚上有上在職班的課所以沒有很早走在趕專案進度,

結尾亂亂的忘記老師到底在哪時結尾

以上如果看不懂 或是有些頁面不知道就看老師步驟

### 老師步驟

//4.1建立ExceptionDemo Action引發錯誤
//4.2替ExceptionDemo Action建立View並測試
//4.3在Web.Config啟用自訂錯誤 <customErrors mode = "On" />
//4.4再測試一次ExceptionDemo View(會把錯誤導向Error.cshtml)

//4.5 建立SlideShow Action並自訂NotImplementedException錯誤
//4.6 替SlideShow Action建立View並測試(仍會把錯誤導向Error.cshtml)

//4.7 在Shared目錄建立ExceptionError View
//    在ExceptionError.cshtml使用System.Web.Mvc.HandleErrorInfo 取出ControllerName,ActionName及Exception.Message屬性

//4.8 在global.asax註冊使用GlobalFilterCollection(Web Application層級)
//4.8-1其實在FilterConfig.cs裡已經被註冊使用GlobalFilterCollection,因此預預都會導到Error.cshtml
//在global.asax裡若把GlobalFilters.Filters.Add(new HandleErrorAttribute() { View = "ExceptionError" })
//寫法GlobalFilterCollection之前,則會用GlobalFilterCollection,若寫在之後,則會用
//GlobalFilters.Filters.Add(new HandleErrorAttribute() { View = "ExceptionError" })

//4.9 改寫在Shared目錄裡的Error View(已存在,可直接修改內容)
//4.9-1 在Error.cshtml使用System.Web.Mvc.HandleErrorInfo 取出ControllerName,ActionName及Exception.Message屬性
//4.9-2 使用System.Web.Mvc.HandleErrorInfo
//      @model System.Web.Mvc.HandleErrorInfo
//4.9-3取出ControllerName,ActionName及Exception.Message屬性*@
//      <fieldset>
//          <legend>HandleErrorInfo</legend>
//           Controller: @Model.ControllerName<br />
//           Action: @Model.ActionName<br />
//           Message: @Model.Exception.Message
//      </fieldset>


//4.10 在PhotoController加入 [HandleError(View = "Error")]屬性(Controller層級,會覆蓋Global層級)
// 若只加[HandleError],沒指定View的話,不管Global設定什麼,都會導到預設

//4.11 在Web.config設計400與404錯誤的重新導向

//<httpErrors errorMode = "Custom" >
//     <remove statusCode="400"/>
//     <remove statusCode = "404" />

//     <error statusCode="400" path="/400.html" responseMode="ExecuteURL"/>
//     <error statusCode = "404" path="/404.html" responseMode="ExecuteURL"/>
//</httpErrors>

Previous2019/0612/WebSockets Notification + MVC Part2 PhotoSharing PartialView & ADO.NET & EntitySQL & VMdNext2019/0614/第十二次專案報告 功能Demo

Last updated 5 years ago

Was this helpful?