創建--前臺表單數據提交到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