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

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

ASP.NETMVC音樂(lè)商店-5.通過(guò)支架創(chuàng)建編輯表單續(xù)

轉(zhuǎn)載自思勝.net培訓(xùn)高級(jí)講師郝冠軍博客http://www.cnblogs.com/haogj/archive/2011/11/08/2241710.html
 

查看 StoreManager 控制器的代碼

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

在澄邁等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,澄邁網(wǎng)站建設(shè)費(fèi)用合理。

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

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();
復(fù)制代碼

Index 和 Details Action

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

//
// GET: /StoreManager/

public ActionResult Index()
{
var albums = storeDB.Albums.Include("Genre").Include("Artist");
return
View(albums.ToList());
}
復(fù)制代碼

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

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

public ViewResult Details(int id)
{
MvcMusicStore.Models.Album album = storeDB.Albums.Find(id);
return
View(album);
}
復(fù)制代碼

創(chuàng)建方法 Create

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

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

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

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

使用 ViewBag 向視圖傳遞信息

我們?cè)?jīng)在這個(gè)教程的開始使用過(guò) ViewBag, 但是,沒有深入討論它,ViewBag 允許我們向視圖傳遞信息而不需要首先定義強(qiáng)類型的 Model,在創(chuàng)建專輯的 Action 中,因?yàn)樵诒韱沃行枰獌蓚€(gè)列表框,我們需要向視圖傳遞列表所需要的數(shù)據(jù),以便在視圖中填充下拉列表框,最簡(jiǎn)單的方式就是通過(guò) ViewBag 來(lái)實(shí)現(xiàn)。

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

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

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

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

用來(lái)生成下拉列表中信息的集合,注意,不是一個(gè)字符串集合,我們這里是流派對(duì)象的集合。

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

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

理解了上面的內(nèi)容,代碼就很簡(jiǎn)單了,兩個(gè) SelectList 對(duì)象通過(guò) ViewBag 傳遞給視圖,沒有使用模型對(duì)象,我們也沒有創(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();
}
復(fù)制代碼

在 Create 視圖中使用 HtmlHelper 來(lái)顯示下拉列表

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

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

修改為

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

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

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

獲取 Post 表單中的值

我們?cè)谇懊嬗懻撨^(guò),對(duì)于一個(gè)表單可以有兩個(gè)對(duì)應(yīng)的處理方法,一個(gè)處理 Http Get 請(qǐng)求顯示表單,另外一個(gè)用于處理 Http Post 請(qǐng)求,用于處理提交的表單數(shù)據(jù),注意,在控制器中,處理 Http Post 請(qǐng)求的方法需要通過(guò)標(biāo)簽 [HttpPost] 進(jìn)行標(biāo)注,這樣,這個(gè)方法將會(huì)被 ASP。NET 僅僅用來(lái)處理 Post 請(qǐng)求。

//
// 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);
}
復(fù)制代碼

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

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

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

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

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

驗(yàn)證模型

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

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

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

db.Albums.Add(album);

db.SaveChanges();

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

顯示帶有驗(yàn)證提示信息的表單

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

測(cè)試創(chuàng)建表單

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

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

處理編輯

編輯處理的一對(duì) Action 方法非常類似我們剛剛看到的 Create 處理。由于編輯的情況需要對(duì)已經(jīng)存在的唱片進(jìn)行處理,在編輯的 Get 方法中,我們使用唱片的 Id 來(lái)加載原有的唱片,這個(gè)參數(shù)通過(guò)路由傳遞過(guò)來(lái),實(shí)際的代碼類似在 Details 中看到的處理。除了專輯對(duì)象,同時(shí)還有處理下拉列表,所以,這里也通過(guò) ViewBag 來(lái)處理,這樣就允許我們?cè)趥鬟f一個(gè) Model 的同時(shí)還通過(guò) ViewBag 傳遞了兩個(gè)額外的 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);
}
復(fù)制代碼

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

// 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);
}
復(fù)制代碼

注意,這個(gè)時(shí)候,編譯器會(huì)提示一個(gè)錯(cuò)誤:

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

添加這個(gè)程序集的引用。

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

處理刪除

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

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

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

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

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

@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"
)


}
復(fù)制代碼

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

點(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"
);
}
復(fù)制代碼

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

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

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

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

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

使用自定義的 HtmlHelper 截?cái)辔谋緝?nèi)容

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

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

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

}
}
復(fù)制代碼

頁(yè)面將會(huì)變成下面的樣子。

ASP.NET MVC 音樂(lè)商店 - 5. 通過(guò)支架創(chuàng)建編輯表單 續(xù)

這個(gè)助手方法取得一個(gè)字符串和一個(gè)最大長(zhǎng)度,如果字符串長(zhǎng)度小于指定的長(zhǎng)度,就直接返回這個(gè)串,如果大于最大長(zhǎng)度,那么,就截?cái)嘧址?,然后在剩下的最后增?“…”。

現(xiàn)在,我們使用這個(gè)截?cái)嘧址闹址椒▉?lái)確保專輯名稱和藝術(shù)家名稱小于 25 個(gè)字符,完整的視圖內(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 })
復(fù)制代碼

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

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

如果希望在多個(gè)視圖中使用這個(gè)擴(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) + "..."
;
}
}
}
}

復(fù)制代碼

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

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

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

復(fù)制代碼

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























>

 


文章標(biāo)題:ASP.NETMVC音樂(lè)商店-5.通過(guò)支架創(chuàng)建編輯表單續(xù)
網(wǎng)站URL:http://weahome.cn/article/pgooij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部