真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ASP.NETMVC音樂商店-5通過支架創(chuàng)建編輯表單續(xù)-創(chuàng)新互聯(lián)

查看 StoreManager 控制器的代碼

現(xiàn)在,Store Manager 控制器中已經(jīng)包含了一定數(shù)量的代碼,我們從頭到尾重新過一下。

成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(成都創(chuàng)新互聯(lián)).為客戶提供專業(yè)的成都棕樹機(jī)房,四川各地服務(wù)器托管,成都棕樹機(jī)房、多線服務(wù)器托管.托管咨詢專線:18982081108

首先,在控制器中包含了標(biāo)準(zhǔn)的 MVC 控制器的代碼,為了使用方便,還可以引用我們的模型類所在的命名空間 MvcMusicStore.Models??刂破鬟€擁有了一個私有的 MusicStoreEntities 的私有成員,以方便控制器中的每個 Action 訪問數(shù)據(jù)庫。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using MvcMusicStore.Models;

namespace MvcMusicStore.Controllers
{
public class StoreManagerController : Controller
{
MvcMusicStore.Models.MusicStoreEntities storeDB
= new MvcMusicStore.Models.MusicStoreEntities();

Index 和 Details Action

Index 視圖獲取專輯的列表,包含每一個專輯引用的流派和藝術(shù)家信息,向我們在前面 Store控制器的 Browse時候看到的,Index 視圖中需要包含對于鏈接到的流派和藝術(shù)家對象來顯示相關(guān)的信息,所以,在 Index 的 Action 方法中,需要包含這些數(shù)據(jù)。

//
// GET: /StoreManager/

public ActionResult Index()
{
var albums = storeDB.Albums.Include("Genre").Include("Artist");
return View(albums.ToList());
}

在 Details 方法中,類似于 Store 控制器的 Details 方法,通過專輯的 Id 來獲取專輯對象,這里使用 Find() 方法完成,最后,把這個對象傳遞給視圖。

//
// GET: /StoreManager/Details/5

public ViewResult Details(int id)
{
MvcMusicStore.Models.Album album = storeDB.Albums.Find(id);
return View(album);
}

創(chuàng)建方法 Create

與前面看到的不同,Create 方法需要處理表單,當(dāng)用戶第一次訪問地址 /StoreManager/Create 的時候,用戶將會看到一個空的表單,HTML 頁面中包含一個

元素,其中包含了下拉列表和文本框等輸入元素,用戶可以借助他們輸入專輯的詳細(xì)信息。

當(dāng)用戶填寫了專輯的信息之后,可以通過點(diǎn)擊 “保存” 按鈕來提交表單信息到服務(wù)器,我們de應(yīng)用程序可以獲取這些信息保存到數(shù)據(jù)庫中。在用戶點(diǎn)擊 “保存” 的時候,瀏覽器發(fā)出一個 Http 的 Post 請求,到 /StoreManager/Create 地址,表單的內(nèi)容作為這個 Post 請求的一部分發(fā)送回服務(wù)器。

ASP.NET MVC 允許我們?nèi)菀椎胤指钸@兩種同樣對于 Create 方法的請求處理,通過提供兩個同名的 Create 方法,一個用來處理 Http Get 請求,一個用來處理 Http Post 請求,區(qū)分的方式是在處理 Post 請求的方法前面增加一個 [HttpPost] 的標(biāo)簽。如果增加 [HttpGet] 標(biāo)簽,則表示這個方法僅僅處理 Http Get 請求。通常沒有這個標(biāo)簽,則表示無論是 Get 請求還是 Post 請求都可以由這個 Action 方法處理。

使用 ViewBag 向視圖傳遞信息

我們曾經(jīng)在這個教程的開始使用過 ViewBag, 但是,沒有深入討論它,ViewBag 允許我們向視圖傳遞信息而不需要首先定義強(qiáng)類型的 Model,在創(chuàng)建專輯的 Action 中,因為在表單中需要兩個列表框,我們需要向視圖傳遞列表所需要的數(shù)據(jù),以便在視圖中填充下拉列表框,最簡單的方式就是通過 ViewBag 來實現(xiàn)。

ViewBag 是動態(tài)對象,這意味著你可以使用 ViewBag.Foo 或者 ViewBag.YourNameHere 形式的屬性而不需要預(yù)先定義這些屬性,控制器中的代碼使用 ViewBag.GenreId 和 ViewBag.Artisid 傳遞流派和藝術(shù)家的信息以便生成表單中下拉列表的值,以后,用來在新創(chuàng)建的專輯中使用。

傳遞到視圖的下拉列表的值使用 SelectList 對象表示,對于我們的要求,使用下面的代碼。

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name");

方法中的三個參數(shù)被用于創(chuàng)建這個對象:

用來生成下拉列表中信息的集合,注意,不是一個字符串集合,我們這里是流派對象的集合。

方法的第二個參數(shù)提供下拉列表中的值,這是一個字符串,實際上是流派對象的一個屬性 GenreId。

最后的參數(shù)提供下拉列表中顯示出來的值,這里使用流派的 Name 屬性。

理解了上面的內(nèi)容,代碼就很簡單了,兩個 SelectList 對象通過 ViewBag 傳遞給視圖,沒有使用模型對象,我們也沒有創(chuàng)建這樣用途的模型。

//
// GET: /StoreManager/Create
public ActionResult Create()
{
ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name");
ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name");
return View();
}

在 Create 視圖中使用 HtmlHelper 來顯示下拉列表

下拉列表的數(shù)據(jù)已經(jīng)被傳遞到了視圖中,現(xiàn)在,我們看一下視圖如何使用這些數(shù)據(jù)顯示一個下拉列表,在 Create 視圖中,將原來顯示流派標(biāo)識的代碼

@Html.LabelFor(model => model.GenreId)

修改為

@Html.DropDownList("GenreId", String.Empty)

這里使用了 HtmlHelper ,一個用于視圖中生成 Html 的實用工具,使用 HtmlHelper 可以保持我們的視圖清楚和易讀。Html.DropDownList 助手方法由 ASP.NET MVC 提供,后面可以看到,我們也可以提供自己的助手方法進(jìn)行擴(kuò)展。

Html.DropDownList 方法需要兩個參數(shù),從哪里獲取顯示用的列表,和哪一個值需要被預(yù)先選中,方法的第一個參數(shù), GenreId,告訴DropDownList 從模型對象或者 ViewBag 對象中尋找名為 GenreId 的屬性值,第二個參數(shù)用來指出下拉列表默認(rèn)選中的值。這是創(chuàng)建專輯的表單,所以,沒有需要預(yù)先選中的值,這里傳遞了一個 String.Empty 。

獲取 Post 表單中的值

我們在前面討論過,對于一個表單可以有兩個對應(yīng)的處理方法,一個處理 Http Get 請求顯示表單,另外一個用于處理 Http Post 請求,用于處理提交的表單數(shù)據(jù),注意,在控制器中,處理 Http Post 請求的方法需要通過標(biāo)簽 [HttpPost] 進(jìn)行標(biāo)注,這樣,這個方法將會被 ASP。NET 僅僅用來處理 Post 請求。

//
// POST: /StoreManager/Create

[HttpPost]
public ActionResult Create(Album album)
{
if (ModelState.IsValid)
{
storeDB.Albums.Add(album);
storeDB.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name", album.ArtistId);
return View(album);
}

這個 Action 方法完成四個任務(wù):

  1. 讀取表單的數(shù)據(jù)
  2. 檢查表單的數(shù)據(jù)是否通過了驗證規(guī)則
  3. 如果表單通過了驗證,保存數(shù)據(jù),然后顯示更新之后的專輯列表
  4. 如果表單沒有通過驗證,重新顯示帶有驗證提示信息的表單。

通過模型綁定獲取表單數(shù)據(jù)

控制器處理的表單提交中包含了流派的標(biāo)識 GenreId 和 藝術(shù)家標(biāo)識 ArtistId,這些來自下拉列表框,以及通過文本框輸入的 Title,Price 等等數(shù)據(jù),雖然可以直接通過 FormCollection 來訪問表單數(shù)據(jù),但是,更好的做法是使用 ASP.NET MVC 內(nèi)置提供的模型綁定。

當(dāng) Action 方法的參數(shù)是模型類型的時候,ASP.NET MVC 將會試圖使用表單中的數(shù)據(jù)來填充對象的屬性,它通過檢查表單參數(shù)的名字是否匹配模型對象的屬性來進(jìn)行,例如,對于專輯對象的 GenreId 屬性來說,它將會在表單數(shù)據(jù)中查找名為 GenreId 的值賦予它。當(dāng)使用標(biāo)準(zhǔn)的模型方式生成視圖的時候,表單會使用模型對象的屬性名稱來生成表單輸入項目的名稱,這樣,在發(fā)出表單的時候,請求參數(shù)就會正好匹配模型的屬性了。

驗證模型

通過訪問 ModelState 的 IsValid 屬性就可以檢查模型是否通過驗證。這里我們還沒有為 Album 提供任何的驗證規(guī)則,后面我們就會提供,所以,這里的驗證并沒有實際的作用。驗證的重要性取決于我們定義的在模型上的驗證規(guī)則,如果我們已經(jīng)提供了對于 ModelState 的 IsValid 檢查的話,以后增加驗證規(guī)則就不需要修改這里的代碼。

保存提交的數(shù)據(jù)

如果提交的數(shù)據(jù)通過了驗證,下一步就可以保存到數(shù)據(jù)庫中,使用 EF,僅僅需要將模型對象加入到 Albums 的集合中,然后調(diào)用 SaveChanges 方法就可以了。

db.Albums.Add(album);

db.SaveChanges();

EF 將會生成適當(dāng)?shù)?SQL 命令來持久化對象,保存數(shù)據(jù)之后,我們重定向到專輯列表的頁面,以便看到更新之后的內(nèi)容。這可以通過調(diào)用 RedirectToAction 方法,并提供 Action 方法的名稱來完成。在這里,我們使用 Index 。

顯示帶有驗證提示信息的表單

如果沒有通過驗證,與 GET 處理的時候相同,我們通過 ViewBag 傳遞下拉列表的值,通過模型傳遞其他的數(shù)據(jù),驗證的提示信息由 @HtmlValidationMessageFor 助手方法自動顯示在頁面上。

測試創(chuàng)建表單

測試一下,運(yùn)行程序,訪問 /StoreManager/Create,你將會看到一個由 StoreManagerController 的 Create 方法處理 Http Get 請求生成的空白表單。

填寫一些內(nèi)容,然后點(diǎn)擊創(chuàng)建按鈕提交表單。

可以看到內(nèi)容已經(jīng)被添加。

處理編輯

編輯處理的一對 Action 方法非常類似我們剛剛看到的 Create 處理。由于編輯的情況需要對已經(jīng)存在的唱片進(jìn)行處理,在編輯的 Get 方法中,我們使用唱片的 Id 來加載原有的唱片,這個參數(shù)通過路由傳遞過來,實際的代碼類似在 Details 中看到的處理。除了專輯對象,同時還有處理下拉列表,所以,這里也通過 ViewBag 來處理,這樣就允許我們在傳遞一個 Model 的同時還通過 ViewBag 傳遞了兩個額外的 SelectList。

//
// GET: /StoreManager/Edit/5
public ActionResult Edit(int id)
{
Album album = storeDB.Albums.Find(id);
ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name", album.ArtistId);
return this.View(album);
}

處理 Post 請求的 Edit 方法也非常類似于 Create 的 Post 處理方法,僅有的不同就是不用創(chuàng)建一個新的專輯對象加入到集合中,而是將現(xiàn)有的專輯對象,注意已經(jīng)通過模型綁定獲取了請求參數(shù),將這個對象的狀態(tài)屬性 State 修改為 Modified ,這就回告訴 EF 我們正在修改一個存在的專輯對象,而不是創(chuàng)建一個新的。

// POST: /StoreManager/Edit/5
[HttpPost]
public ActionResult Edit(Album album)
{
if (ModelState.IsValid)
{
storeDB.Entry(album).State = System.Data.EntityState.Modified;
storeDB.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.GenreId = new SelectList(storeDB.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(storeDB.Artists, "ArtistId", "Name", album.ArtistId);
return View(album);
}

注意,這個時候,編譯器會提示一個錯誤:

類型“System.Data.EntityState”在未被引用的程序集中定義。必須添加對程序集“System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。        F:LessonMVCMvcMusicStoreMvcMusicStoreControllersStoreManagerController.cs 76    17    MvcMusicStore

添加這個程序集的引用。

下面我們運(yùn)行程序測試一下,瀏覽/StoreManager,然后點(diǎn)擊 Edit 鏈接。

點(diǎn)擊 Save, 回到專輯列表,可以看到值已經(jīng)被更新了。

處理刪除

刪除的處理模式與 Edit 和 Create 一樣,使用一個控制器的 Action 顯示確認(rèn)信息,使用另外一個 Action 來處理提交。

刪除的 Get 處理非常類似于前面的 Details 處理。

//
// GET: /StoreManager/Delete/5
public ActionResult Delete(int id)
{
Album album = storeDB.Albums.Find(id);
return View(album);
}

使用 Delete 視圖模板顯示強(qiáng)類型的 Album 表單。

默認(rèn)的 Delete 視圖使用模型來顯示信息,但是,我們僅僅需要簡單地顯示確認(rèn)信息就可以了,把這個視圖修改一下,變成下面的樣子。

@model MvcMusicStore.Models.Album
@{
ViewBag.Title = "Delete"; }


Delete Confirmation



Are you sure you want to delete the album titled @Model.Title?


@using (Html.BeginForm())
{





@Html.ActionLink("Back to List", "Index")


}

這樣,確認(rèn)頁面就成了下面的樣子。

點(diǎn)擊 Delete 按鈕之后,將導(dǎo)致表單發(fā)送到服務(wù)器,執(zhí)行 DeleteConfirmed 的 Action 處理方法。

//
// POST: /StoreManager/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
Album album = storeDB.Albums.Find(id);
storeDB.Albums.Remove(album);
storeDB.SaveChanges();
return RedirectToAction("Index");
}

在我們的 Post 處理中,完成了下面的任務(wù)

  1. 通過專輯的 Id 加載專輯對象
  2. 刪除專輯,然后保存所做的修改
  3. 重新定向到 Index, 顯示刪除專緝之后的列表。

測試一下這些工作,運(yùn)行程序,選擇一個專輯,然后刪除它。

點(diǎn)擊刪除之后,顯示了第一張專輯的刪除確認(rèn)頁面。

點(diǎn)擊刪除之后,原來的專輯已經(jīng)消失了。

使用自定義的 HtmlHelper 截斷文本內(nèi)容

我們的管理首頁存在一個潛在的問題,我們的專輯名稱和藝術(shù)家名稱可能比較長,這會影響到我們的頁面。下面我們創(chuàng)建一個自定義的 HtmlHelper 擴(kuò)展來使得我們可以輕易地截斷比較長的字符串。在視圖中顯示成這樣的效果

Rozor 的 @helper 可以使這個工作變得很容易實現(xiàn),打開 /View/StoreManager/Index.cshtml視圖,直接在 @model 的下面增加下面的代碼。

@helper Truncate(string input, int length)
{
if (input.Length <= length)
{
@input
}
else
{
@input.Substring(0, length)...

}
}

頁面將會變成下面的樣子。

這個助手方法取得一個字符串和一個大長度,如果字符串長度小于指定的長度,就直接返回這個串,如果大于大長度,那么,就截斷字符串,然后在剩下的最后增加 “…”。

現(xiàn)在,我們使用這個截斷字符串的助手方法來確保專輯名稱和藝術(shù)家名稱小于 25 個字符,完整的視圖內(nèi)容如下所示。

@model IEnumerable
@helper Truncate(string input, int length)
{
if (input.Length <= length)
{
@input
}
else
{
@input.Substring(0, length)...
}
}
@{
ViewBag.Title = "Index";
}


Index



@Html.ActionLink("Create New", "Create")










@foreach (var item in Model)
{









}

Genre

Artist

Title

Price


@Html.DisplayFor(modelItem => item.Genre.Name)

@Truncate(item.Artist.Name, 25)

@Truncate(item.Title, 25)

@Html.DisplayFor(modelItem => item.Price)

@Html.ActionLink("Edit", "Edit", new { id = item.AlbumId }) |
@Html.ActionLink("Details", "Details", new { id = item.AlbumId }) |
@Html.ActionLink("Delete", "Delete", new { id = item.AlbumId })

注意,這里展示了簡單地在一個視圖中使用 HtmlHelper 的方式,關(guān)于更多的信息,請參考:

http://bit.ly/mvc3-helper-options

如果希望在多個視圖中使用這個擴(kuò)展的助手方法,可以如下進(jìn)行。

using System.Web.Mvc;

namespace MvcMusicStore.Helpers
{
public static class HtmlHelpers
{
public static string Truncate(this HtmlHelper helper, string input, int length)
{
if (input.Length <= length)
{
return input;
}
else
{
return input.Substring(0, length) + "...";
}
}
}
}

注意,使用擴(kuò)展方法必須 using 其命名空間

@{
ViewBag.Title = "Home Page";
}
@using MvcMusicStores.Helpers

@Html.Truncate(ViewBag.Message as string, 8)

你也可以在配置文件 web.config 中統(tǒng)一定義。
























新聞名稱:ASP.NETMVC音樂商店-5通過支架創(chuàng)建編輯表單續(xù)-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://weahome.cn/article/giigj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部