[MVC5_005]新增view檢視以新增一筆單車路徑資料

[MVC5_005]新增view檢視以新增一筆單車路徑資料

如果在asp.net mvc底下新增一個view來新增一筆資料的話,除了資料表的必要欄位之外,還要設計為RWD的網頁。首先來做樣版template囉
_LayoutForm.cshtml:寫了超多註解,應該看註解就懂囉

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>@ViewBag.Title</title>
    <style type="text/css">
        /*元素的寬度不因為padding以及border的設定修改而變化,加上此屬性後,頁面上右邊邊界的距離才不會太窄*/
        * {
            -webkit-box-sizing: border-box; /*chrome,safari瀏覽器*/
            -moz-box-sizing: border-box;/*firefox*/
            box-sizing: border-box;/*ie8*/
        }

        @@media only screen and (max-width: 768px) {
            /*瀏覽器寬度小於768px的時候,會套用這個css*/
            /*當作手機或是平板的寬度*/
            /*每一行的input之間,要有點空隙,不然會很擠不好看*/
            form > div > div {
                /*每一行的input之間,要有點空隙,不然會很擠不好看*/
                margin: 0 0 5px 0;                
            }
            /*手機螢幕時,textbox寬度要跟螢幕同寬,比較好看*/
            input[type=text], textarea {
                width: 100%;
            }
        }

        @@media screen and (min-width: 768px) and (max-width: 1200px) {
            /*瀏覽器寬度介於768px~1200px的時候,會套用這個css*/
            /*當作是平版的寬度*/
            form > div > label {
                /*每個欄位顯示的中文名稱跟input顯示在同一行,而且文字靠左*/
                float: left;
                /*中文名稱的儲存格寬度設定成一樣寬20%,才能達到跟之前Html4的table排版一樣整齊的效果*/
                width: 20%;
            }

            form > div > div {
                /*每一行的input之間,要有點空隙,不然會很擠不好看*/
                margin: 0 0 5px 0;
                /*每個input的儲存格設定成一樣寬80%,,才能達到跟之前Html4的table排版一樣整齊的效果*/
                width: 80%;
            }

            input[type=text], textarea {
                width: 50%;
            }

            textarea {
                width: 75%;
            }
        }
        
        @@media screen and (min-width: 1200px) {
            /*瀏覽器寬度大於1200px的時候,會套用這個css*/
            /*當作是電腦、筆電寬度*/
            /*每個欄位顯示的中文名稱要靠右也可以*/
            form > div > label {
                /*每個欄位顯示的中文名稱跟input顯示在同一行,而且文字靠左*/
                float: left;
                /*中文名稱的儲存格寬度設定成一樣寬20%,才能達到跟之前Html4的table排版一樣整齊的效果*/
                width: 20%;
                /*文字靠右:管理資訊系統的通則, 但也不要整個黏在右邊的input旁邊*/
                text-align: right;
                padding-right: 10px;
            }

            form > div > div {
                /*每一行的input之間,要有點空隙,不然會很擠不好看*/
                margin: 0 0 5px 0;
                /*每個input的儲存格設定成一樣寬80%,,才能達到跟之前Html4的table排版一樣整齊的效果*/
                width: 80%;
            }

            input[type=text], textarea {
                width: 50%;
            }

            textarea {
                width: 75%;
            }
        }

           
        
    </style>
</head>
<body>
    <h2>@ViewBag.Title</h2>
    @using (Html.BeginForm("Create", "CyclingRoutes", FormMethod.Post))
    {

        @RenderBody();

    }

</body>
</html>

然後是View的部分,由於沒什麼複雜的,就不說明然後直接貼上方便以後參考:

@model IEnumerable<CyclingRoutesMeetup.Models.CyclingRoutes>
@{
    Layout = "~/Views/Shared/_LayoutForm.cshtml";
}

<div>
    @*沒有設定css media query的情況下,路徑名稱以及textbox會在不同行(由於textbox包在div裡面的關係),剛好適合手機的排版*@
    <label>@Html.DisplayNameFor(model => model.RouteName)</label>
    <div>
        <input id="RouteName" name="RouteName" type="text">
    </div>
</div>
<div>
    <label>@Html.DisplayNameFor(model => model.Distance)</label>
    <div>
        <input id="Distance" name="Distance" type="text">
    </div>
</div>
<div>
    <label>@Html.DisplayNameFor(model => model.RidingTime)</label>
    <div>
        <input id="RidingTime" name="RidingTime" type="text">
    </div>
</div>
<div>
    <label>@Html.DisplayNameFor(model => model.Altitude)</label>
    <div>
        <input id="Altitude" name="Altitude" type="text">
    </div>
</div>
<div>
    <label>@Html.DisplayNameFor(model => model.GMapCode)</label>
    <div>
        <textarea id="GMapCode"></textarea>
    </div>
</div>
<div>
    <label>@Html.DisplayNameFor(model => model.BikeMapUrl)</label>
    <div>
        <input id="BikeMapUrl" name="BikeMapUrl" type="text">
    </div>
</div>
<div>
    <label>@Html.DisplayNameFor(model => model.Introduction)</label>
    <div>
        <input id="Introduction" name="Introduction" type="text">
    </div>
</div>
<div>
    <label><input type="submit" value="送出" />@*這是為了防止CSRF攻擊的參數*@@Html.AntiForgeryToken()</label>
    <div>

    </div>
</div>


最後是controller的部分:
 

//這是進入key資料網頁的controller
public ActionResult Create()
{
	//用來取得該欄位在MetadataClass的中文名稱用,所以故意只取得一筆
	var routesForDisplayName = db.CyclingRoutes.Take(1).ToList();
	return View("Create");
   
}

//這是進入key資料完畢之後,按下submit按鈕之後會跑的程式碼的controller
// POST: /Guestbook/Create
//限定為post        
//ValidateInput簡易的檢驗input
[HttpPost]
[ValidateAntiForgeryToken]//防止CSRF攻擊(網頁上的submit按鈕之前,需放一個@Html.AntiForgeryToken(),方可有效)
[ValidateInput(true)]//加上這行就可以驗證輸入不合法字元(通常搭配HttpPost使用)            
public ActionResult Create(CyclingRoutes route)
{//傳入畫面上的物件

	//檢查ModelState是否異常//透過filter檢查,但還沒建立filter,所以。。。沒檢查到XD
	//但養成好習慣這樣子寫,以後比較好
	if (ModelState.IsValid)
	{
		//沒異常就...存檔
		db.CyclingRoutes.Add(route);
		db.SaveChanges();
		//然後回到查詢page
		
		return RedirectToAction("Index");
	}          

	//有異常就....回原畫面囉
	return View(route);
}

執行的畫面:
以下是三種螢幕寬度顯示出來的RWD效果:

然後key資料準備塞資料到Db囉

按下送出之後,成功塞資料到資料庫,查詢的時候多了一筆資料
大概是這樣。。。