MVC 中的Model對象

創建--前臺表單數據提交到Controller

複製代碼

@model MVC_plug.Models.Students@{
    ViewBag.Title = "Create";
}<h2>Create</h2>@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)    <fieldset>
        <legend>Students</legend>  
        <div class="editor-label">
            @Html.LabelFor(model => model.Stu_Name)        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Stu_Name)
            @Html.ValidationMessageFor(model => model.Stu_Name)        </div>

複製代碼

參考室友的意見 + 斷點,這裏 瀏覽器解析Razor 語法是 將 BeginForm 解析爲From表單,對於HTML來說是,是不存在實體類之說的,表單提交的值僅僅是以鍵值對的方式進行存儲後提交到指定的Action中.

1 .在Controller中對應的Action的方法體中 將 Student 作爲參數來接收

複製代碼

        [HttpPost]        public ActionResult Create(Students students)
        {            if (ModelState.IsValid)
            {
                db.Students.Add(students);
                db.SaveChanges();                return RedirectToAction("Index");
            }            return View(students);
        }

複製代碼

既然View中不存在將提交的內容綁定到 實體類中,那麼輸入的數據爲什麼在Action的參數Student中可以點出來? 實際上 View 中Post提交的數據 是以鍵值對的方式進行存儲,然後映射到提交的Action中的 Student中,前提是 View中的鍵名(Name名字)必須要等於 實體類型的屬性名,否則無法映射 

2.在Controller中對應的Action的方法體中直接設置參數來接收值 ()

 public ActionResult Create(string Stu_Name,string Tel,string phone)

運行項目,其中Stu_Name、Tel 有值,phone 無值,當然這只是佐證,如果在前臺的View 中設置的名字不一樣,後臺用Student去接收,同樣也會得到空值。

後臺傳遞數據到前臺

1. 顯示某數據列表 ,同樣是後臺Controller 將 查詢的結果 賦值給一個實體類對象,用反射也好,反序也行,再 Return View(實體類); 

    前臺最上面要引用 @model 指向實體類 來接收傳遞的數據,因爲是同一個實體,直接映射到前臺,最後View 中進行顯示即可

2. 當然還可以選擇 ViewData 和ViewBag 在後臺的Action中賦值,然後在View中接收,關於這兩者的比較,這裏簡單的整理下

    ViewData 的 ViewDataDictionary 是一個特殊的字典類,當在控制器中使用 ViewData["CurrentTime"] = DateTime.Now; 其實是將這個值以鍵值對的形式進行存儲

    ViewBag不再是字典的鍵值對結構,而是dynamic動態類型,它會在程序運行的時候動態解析

MVC 高級編程中提高兩者的區別

①只有當要訪問的關鍵字是一個有效的C#標識符時,ViewBag 才起作用。 

例如,如果在ViewData["Key With Spaces"]中存放一個值,那麼就不能使用ViewBag訪問。因爲這樣根本就無法通過編譯。

②動態值不能作爲一個參數傳遞給擴展方法。因爲C#編譯器爲了選擇正確的擴展方法,在編譯時必須知道每一個參數的真正類型。如果其中任何一個參數是動態的,那麼就不會通過編譯。

例如,這行代碼就會編譯失敗:@Html.TextBox("name",ViewBag.Name)。要使這行代碼通過編譯有兩種方法:第一是使用ViewData["Name"],第二是把ViewBag.Name值轉換爲一個具體的型:(string)ViewBag.Name 。

說白了,ViewBag 就是在ViewData的升級版,兩者只能在Action中起作用,當然,兩者的數據是可以相互訪問

mvc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章