MVC 5 Controller

摘要: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屬性