MVC4--Model常见问题

添加实体类模型文件

复制代码
public class Album
{
public virtual int AlbumId { get; set; }
public virtual int GenreId { get; set; }
public virtual int ArtistId { get; set; }
public virtual string Title { get; set; }
public virtual decimal Price { get; set; }
public virtual string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
复制代码
public class Artist
{
public virtual int ArtistId { get; set; }
public virtual string Name { get; set; }
}
复制代码
public class Genre
{
public virtual int GenreId { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual List<Album> Albums { get; set; }
}
复制代码

The DbContext Class

复制代码

public class MusicStoreDB : DbContext
{
public DbSet<Album> Albums { get; set; }
public DbSet<Genre> Genres { get; set; }
public DbSet<Artist> Artists { get; set; }
}

复制代码

LINQ语句查询方式

var db = new MusicStoreDB();
var allAlbums = from album in db.Albums
orderby album.Title ascending
select album;

The StoreManagerController控制器

复制代码
public class StoreManagerController : Controller
{
private MusicStoreDB db = new MusicStoreDB();

//
// GET: /StoreManager/
public ViewResult Index()
{
var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
return View(albums.ToList());
}
复制代码

视图VIEW中遍历数据方式

复制代码
@model IEnumerable<MvcMusicStore.Models.Album>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>@Html.DisplayNameFor(model => model.Genre.Name)</th>
<th>@Html.DisplayNameFor(model => model.Artist.Name)</th>
<th>@Html.DisplayNameFor(model => model.Title)</th>
<th>@Html.DisplayNameFor(model => model.Price)</th>
<th>@Html.DisplayNameFor(model => model.AlbumArtUrl)</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>@Html.DisplayFor(modelItem => item.Genre.Name)</td>
<td>@Html.DisplayFor(modelItem => item.Artist.Name)</td>
<td>@Html.DisplayFor(modelItem => item.Title)</td>
<td>@Html.DisplayFor(modelItem => item.Price)</td>
<td>@Html.DisplayFor(modelItem => item.AlbumArtUrl)</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.AlbumId }) |
@Html.ActionLink("Details", "Details", new { id=item.AlbumId }) |
@Html.ActionLink("Delete", "Delete", new { id=item.AlbumId })
</td>
</tr>
}
</table>
复制代码

数据库连接字符串配置

复制代码
<connectionStrings>
<add name="MusicStoreDB"
connectionString="data source=.\SQLEXPRESS;
Integrated Security=SSPI;
initial catalog=MusicStore"
providerName="System.Data.SqlClient" />
</connectionStrings>
复制代码

三步完成数据初始化

1. 实现模型类.
2. 在控制器中用脚手架视图.
3. 选择数据初始化策略。

Using Database Initializers使用数据库初始化


 

修改global.asax.cs文件

复制代码
protected void Application_Start()
{
Database.SetInitializer(new MusicStoreDbInitializer());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
复制代码

Seeding a Database插入初始数据

复制代码
public class MusicStoreDbInitializer
: DropCreateDatabaseAlways<MusicStoreDB>
{
protected override void Seed(MusicStoreDB context)
{
context.Artists.Add(new Artist {Name = "Al Di Meola"});
context.Genres.Add(new Genre { Name = "Jazz" });
context.Albums.Add(new Album
{
Artist = new Artist { Name="Rush" },
Genre = new Genre { Name="Rock" },
Price = 9.99m,
Title = "Caravan"
});
base.Seed(context);
}
}
复制代码

建立一个资源编辑Album

复制代码
//
// GET: /StoreManager/Edit/8
public ActionResult Edit(int id = 0)
{
Album album = db.Albums.Find(id);
if (album == null)
{
return HttpNotFound();
}

ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId", "Name", album.ArtistId);
return View(album);
}
复制代码

视图页面代码

<div class="editor-field">
@Html.DropDownList("GenreId", String.Empty)
@Html.ValidationMessageFor(model => model.GenreId)
</div>

模型与视图模型

视图页面中可能需要来自多个Model的信息,因此引入视图Model对页面中需要显示的信息汇总到一个模型中。

public class AlbumEditViewModel
{
public Album AlbumToEdit { get; set; }
public SelectList Genres { get; set; }
public SelectList Artists { get; set; }
}

The Edit View编辑视图

复制代码
@using (Html.BeginForm()) {
@Html.DropDownList("GenreId", String.Empty)
@Html.EditorFor(model => model.Title)
@Html.EditorFor(model => model.Price)

<p>
<input type="submit" value="Save" />
</p>
}
复制代码

解析后的html代码

复制代码
<form action="/storemanager/Edit/8" method="post">
<select id="GenreId" name="GenreId">
<option value=""></option>
<option selected="selected" value="1">Rock</option>
<option value="2">Jazz</option>
</select>
<input class="text-box single-line" id="Title" name="Title"
type="text" value="Caravan" />
<input class="text-box single-line" id="Price" name="Price"
type="text" value="9.99" />
<p>
<input type="submit" value="Save" />
</p>
</form>
复制代码

 

Responding to the Edit POST Request 用POST选择器属性,执行相应的动作

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

MODEL BINDING模型绑定

只更新Model中的部分值使用模型绑定的方式

复制代码
[HttpPost]
public ActionResult Edit()
{
var album = new Album();
album.Title = Request.Form["Title"];
album.Price = Decimal.Parse(Request.Form["Price"]);
// ... and so on ...
}
复制代码

Explicit Model Binding显示模型绑定

将页面传入的模型保存在UPdateModel中,出现异常直接返回页面已经选择的值。

复制代码
[HttpPost]
public ActionResult Edit()
{
var album = new Album();
try
{
UpdateModel(album);
db.Entry(album).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
ViewBag.GenreId = new SelectList(db.Genres, "GenreId",
"Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId",
"Name", album.ArtistId);
return View(album);
}
}
复制代码

TryUpdateModel也调用模型绑定,但是不会抛出异常。TryUpdateModel并返回一个布尔- true值如果模型绑定成功,该模型是有效的,返回真,无效返回false。

复制代码
[HttpPost]
public ActionResult Edit()
{
var album = new Album();
if (TryUpdateModel(album))
{
db.Entry(album).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.GenreId = new SelectList(db.Genres, "GenreId",
"Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId",
"Name", album.ArtistId);
return View(album);
}
}
复制代码

验证模型绑定是否成功

复制代码
[HttpPost]
public ActionResult Edit()
{

var album = new Album();
TryUpdateModel(album);
if (ModelState.IsValid)
{
db.Entry(album).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
ViewBag.GenreId = new SelectList(db.Genres, "GenreId",
"Name", album.GenreId);
ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId",
"Name", album.ArtistId);
return View(album);
}}
复制代码

 

posted @ 2013-04-12 15:15  风雪七月花溅墨  阅读(355)  评论(0编辑  收藏  举报