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);

}}
复制代码

 

你可能感兴趣的:(Model)