摘要:MVC 5 Controller方面讀書筆記
網址對應方法
打 http://localhost/ 則請去看 App_Start/RouteConfig.cs 的預設值是甚麼
http://localhost/home/About
程式碼位置: /Controller/HomeController.cs
頁面: /view/home/About
MVC怎麼知道哪頁呼叫自己?
//3
public class TestController : Controller
{
//2
public ActionResult Index()
{
return View(); //1
}
}
Return View沒有指定要回哪一頁 (1)
MVC預設採取Action方法的名稱,得到Index.cshtml (2)
接著在Controller部分得到VIEW下面哪個目錄名稱(3)
此範例就會傳回 \Views\Test\Index.cshtml 去回應USER
找不到Action時的處理方式
可以在Controller覆寫MVC原有的函示來處理
Protected override void HandleUnknownAction (string actionName)
{
Respone.Redirect("http://tw.yahoo.com");
}
動作名稱選取器
public class HelloWorldController : Controller
{
[ActionName("Default")]
public ActionResult Index()
{
ViewBag.name = "CLRIS";
return View();
}
}
這樣打 http://localhost/Home/Index 會進到這函式並取得ViewBag.name
但是由於ActionName的關係,是會把資料回傳到http://View/Home/Default.cshtml上
動作方法選取器
1. NonAction屬性 : 方法不想公開,通常是還未撰寫完成,或不想對外部屬時再用
[NonAction]
public ActionResult Index()
{
ViewBag.name = "CLRIS";
return View();
}
或是
private ActionResult Index()
{
ViewBag.name = "CLRIS";
return View();
}
2. HTTP動詞限定屬性
HttpGet、HttpPost、HttpDelete、HttpPut、HttpHead、HttpOptions、HttpPatch
若是套上HttpGet代表只有當用戶發送HTTP GET要求才會選擇這個Action
可以兩個Action同名但是套上不同的HTTP動詞,比較常見的為
一個套 HttpGet 另外一個套HttpPost來處理不同的邏輯要求
ActionResult的回傳方法
1. ViewResult
public class HelloWorldController : Controller
{
public ActionResult Index()
{
return View(); //回傳 View/Hello/index.cshtml
//return View("About"); //回傳 View/Hello/About.cshtml
//return View("Index", "_Layout"); //回傳 View/Hello/About.cshtml並套_Layout為主版 免副檔名
}
}
2. PartialViewResult
無法為選中View指派主版頁面。可以使用PartialViewResult取得部分內容
用法同View
3. EmptyResult
有時候是統計資料之類的不需要回傳至VIEW可以用這個
public ActionResult Index()
{
return new EmptyResult();
}
//上下兩個同等
public void Index()
{
return;
}
4.ContentResult
回傳使用者自訂文字內容結果
public ActionResult Index()
{
return Content("<ROOT><TEXT>HELLO</TEXT></ROOT>", "text/xml", System.Text.Encoding.UTF8);
//string strHTML = "....";
//return Content(strHTML); 回傳UTF8的HTML碼
}
public ActionResult Index1() //可以這樣產生CSV檔
{
return Content("Name,Age\r\nChris,28\r\n","text/csv");
}
5. FileResult
可以回應任意檔案內容 FileResult類別,一共有三個子類別
- FileContentResult : 來源為Byte[]陣列
- FilePathResult : 來源為檔案路徑
- FileStreamResult : 來源為Stream類別
public ActionResult Index()
{
//回應一張實體路徑圖,檔案格式為PNG (瀏覽器開啟)
return File(Server.MapPath("~/App_Data/Image/picture.png"), "image/png");
//若希望直接下載改用以下方法
//byte[] fileContent = GetFileByteArrayDB();
//return File(fileContent, "application/pdf", "希望的檔名");
}
上傳檔案的部分請參照 6-142 mvc 5
6. JavaScriptResult
記得先載入以下檔案至主版頁面或是各別VIEW中
@Script.Render("~/bundles/jquery")
@Script.Render("~/bundles/jqueryval")
Controller
return JavaScript(" alert('ok') ");
View //第三個參數可不填
@Ajax.ActionLink("連結文字","Controller方法名稱", new AjaxOptions() )
7. JsonResult
任何以JsonResult回傳的要求都不允許用HTTPGET(網址取得) 得到任何JSON資料
public ActionResult JsonResult()
{
return Json(new
{
id = 1,
name = "CLRIS",
score = "90"
});
}
前端
$.getJSON = function(url, data, callback){
$.post(url, data, callback, "json")
}
8. RedirectResult
將網頁導向別頁
public ActionResult Redirect()
{
return Redirect("/Home/about/");
return RedirectPermanent("/Home/about/"); //可保留本頁面的網頁排名紀錄並自動移轉到下一頁
}
9. RedirectToRoute
RedirectToAction與RedirectToActionPermanent屬於比較簡易的版本
直接傳入Action名稱也可傳入新增的RouteValue值
public ActionResult RedirectToActionSample()
{
return RedirectToAction("index"); //轉址到同CONTROLLER的INDEX ACTION
return RedirectToAction("Action名稱", "Controller名稱"); //轉址到特定Controller的ACTION名字
}
RedirectToRoute與RedirectToRoutePermanetx利用路由表轉址
10. HttpStatusCodeResult
11.HttpNotFoundResult
傳到另一個Action的方法
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return RedirectToAction("Index");
}
這樣就會導到Index Action去
1. 但是只有用TempData的參數內容可以保留
2. TempData在Action中存取內容不會被清掉,在view被存取才會消失
3. 若view想要保留存取過的TempData請用 TempData.Keep(string key)
ViewModel
//class部分
public class PagesFilesViewModel
{
public IEnumerable SYS_FilesTemp { get; set; }
public IEnumerable SYS_PagesTemp { get; set; }
}
//controller部分
public ActionResult ViewModels_Test()
{
return View( new PagesFilesViewModel()
{
SYS_FilesTemp = (from c in OuterDB.SYS_FilesTemp select c).Take(10).ToList() ,
SYS_PagesTemp = (from p in OuterDB.SYS_PagesTemp select p).Take(10).ToList()
});
}
//view部分
@model MvcApplication1.Models.PagesFilesViewModel
檔案名稱
@foreach (var item in Model.SYS_FilesTemp)
{
@item.FileName
}
標題名稱
@foreach (var item in Model.SYS_PagesTemp)
{
@item.PageTitle
}
若是輸入 p => p.型別 請加入 using System.Data.Entity;
Tuple
//Controller
public ActionResult Tuple_Test()
{
var PagesTemp = OuterDB.SYS_PagesTemp.Take(10).ToList();
var FileTemp = OuterDB.SYS_FilesTemp.Take(10).ToList();
var tupleMode = new Tuple, List>(PagesTemp, FileTemp);
return View(tupleMode);
}
//View
@using MvcApplication1.Models
@model Tuple, List>
@* item1是SYS_PagesTemp *@
@foreach (var item in Model.Item1)
{
@item.PageTitle
}
@* item2是SYS_FilesTemp*@
@foreach (var item in Model.Item2)
{
@item.FileName
}
記得增加註解因為點出來的是Item1 Item2之類的
簡單的ModelBinding
View部分
@using (Html.BeginForm())
{
<p>
姓名:<input type="text" name="name" />
年齡:<input type="text" name="age" />
<input type="submit" value="送出"
</p>
}
Your Name:@ViewBag.Name
Your Age:@ViewBag.Age
Controller部分
public ActionResult ModelBinding(string name, string age)
{
ViewBag.Name = name;
ViewBag.Age = age;
return View();
}
Controller的參數對應到HTML碼的 name屬性