2012-05-23 25 views
10

Tôi mới dùng MVC3, tôi có nhiều kiểu như BussinessDetails, ContactPerson, ServiceArea, Address và nhiều kiểu máy khác. Tôi có một trang xem duy nhất ở các trang xem được chia sẻ như Contacts, BusinessDetails, Address, ServiceArea v.v. tất cả đều nằm trong các tab. Họ có những mô hình riêng.Cách chỉnh sửa nhiều kiểu máy trong một Dao Cạo Xem

Vấn đề của tôi là cách chỉnh sửa nhiều mô hình trong cùng một trang xem chỉnh sửa. Trước khi gửi bài này tôi lấy sự giúp đỡ của MVC3 "Music Store" ví dụ nhưng chỉ có một mô hình ALBUM và họ cung cấp thao tác chỉnh sửa cho một mô hình nếu có một hoặc nhiều mô hình cách tôi chỉnh sửa trong cùng một trang xem.

Tôi đã tạo lớp đặc tả kinh doanh gốc. Đây là từ MVC "Music Store"

public ActionResult Edit(int id) { 
    Album album = db.Albums.Find(id); 
    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(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); 
}                 

Trong HTTP POST chỉ có trên model ALBUM nếu có nhiều mô hình làm thế nào tôi đang thực hiện chỉnh sửa hoạt động trên nhiều mô hình và xem?

Trả lời

8

Bạn sẽ cần tạo Mô hình chế độ xem có chứa cả hai loại mà bạn cần.Một cái gì đó như thế này (giả sử bạn đang chỉnh sửa cả một album và một Artist):

public class MyModel 
{ 
    public Album Album { get; set; } 
    public Artist Artist { get; set; } 
    public SelectList Genres { get; set; } 
    public SelectList Artists{ get; set; } 
} 

Sau đó thay đổi quan điểm của bạn để sử dụng các mô hình mới như vậy:

@model MyModel 

Sau đó, thay đổi phương thức Nhận của bạn sẽ được cái gì đó như:

public ActionResult Edit(int id) 
{ 
    var model = new MyModel(); 
    model.Album = db.Albums.Find(id); 
    model.Artist = yourArtist; //whatever you want it to be 
    model.Genres = new SelectList(db.Genres, "GenreId", "Name", model.Album.GenreId); 
    model.Artists = new SelectList(db.Artists, "ArtistId", "Name", model.Album.ArtistId); 

    return View(model); 
} 

Sau đó, thay đổi phương thức Đăng hàng của mình để có những MyModel loại:

[HttpPost] 
public ActionResult Edit(MyModel model) { 

    if (ModelState.IsValid) { 
    //save your items here 

     db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    model.Genres = new SelectList(db.Genres, "GenreId", "Name", model.Album.GenreId); 
    model.Artists = new SelectList(db.Artists, "ArtistId", "Name", model.Album.ArtistId); 

    return View(album); 
}  

Giả sử xem của bạn có một cái gì đó tương tự (được bọc trong một hình thức với một nút gửi tất nhiên):

@Html.EditorFor(m => m.Artist.Name) //do this for all Artist Fields 
@Html.EditorFor(m =? m.Album.Name) //do this for all Album Fields 

//the following two show you how to wire up your dropdowns: 
@Html.DropDownListFor(m => m.Album.ArtistId, Model.Artists) 
@Html.DropDownListFor(m => m.Album.GenreId, Model.Genres) 
+1

gì im viết sau if (ModelState. IsValid) { để chỉnh sửa mô hình cụ thể. – user1196392

+0

@ user1196392 Bạn không thể gọi một cái gì đó như 'Save' trên các lớp dữ liệu của bạn? Một cái gì đó như 'model.Album.Save();' cho mỗi loại trong mô hình. – mattytommo

20

Bạn cần phải bao gồm các ViewModels khác vào một chính CompositeModel như vậy

public class CompositeModel { 
    public Album AlbumModel { get; set; } 
    public Another AnotherModel { get; set; } 
    public Other EvenMore { get; set; } 
} 

Gửi cho chế độ xem của bạn như vậy

public ActionResult Index() { 
    var compositeModel = new CompositeModel(); 
    compositeModel.Album = new AlbumModel(); 
    compositeModel.OtherModel = new AnotherModel(); 
    compositeModel.EvenMore = new Other();   
    return View(compositeModel) 
} 

Sửa đổi chế độ xem của bạn để lấy kiểu mô hình mới

@model CompositeModel 

Để tham khảo thuộc tính của các tiểu mô hình, bạn có thể sử dụng cú pháp như thế này

@Html.TextBoxFor(model => model.Album.ArtistName) 

hoặc bạn có thể tạo ra một cái nhìn trong thư mục EditorTemplates mà phải mất một sub-model như AlbumModel và sử dụng EditorFor như thế này

@Html.EditorFor(model => model.Album) 

Mẫu sẽ trông giống như thế này

@model AlbumModel 

@Html.TextBoxFor(model => model.AlbumName) 
@Html.TextBoxFor(model => model.YearReleased) 
@Html.TextBoxFor(model => model.ArtistName) 

Bây giờ chỉ cần đăng CompositeModel quay lại bộ điều khiển của bạn và sau đó lưu tất cả các mô hình phụ và bây giờ Bob là chú của bạn!

[HttpPost] 
public ActionResult Index(CompositModel model) { 
    // save all models 
    // model.Album has all the AlbumModel properties 
    // model.Another has the AnotherModel properties 
    // model.EvenMore has the properties of Other 
} 
+0

giải pháp này không hoạt động đối với tôi – user1196392

+1

Đây chỉ là mã giả, không được thực hiện theo nghĩa đen, bạn sẽ phải tìm ra cách làm cho nó đúng hoặc đăng mã mới mà bạn đang cố gắng để chúng tôi có thể trợ giúp thêm. Giữ vòng lặp phản hồi đi :-) –

0

Một cách khác là sử dụng C# Tuples
http://www.dotnetperls.com/tuple
Theo quan điểm và điều khiển của bạn, xác định một tuple đó là một danh sách các lớp học của bạn (mô hình)

Các vấn đề liên quan