2010-11-15 38 views
9

Mỗi lần tôi thêm một ứng dụng mới Nó tạo ra một AppCategory mới. Tôi chỉnh nghiêm túc này lên bằng cách nào đóASP.NET EditorTemplate DropdownList

đang khuôn khổ thực thể đầu tiên các đối tượng

public class AppCategory 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public ICollection<App> apps { get; set; } 
} 

public class App 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public AppCategory Category { get; set; } 
} 

biên tập Template (Tôi rất thích chỉ cần thực hiện chỉ là một chính EditorTemplate Ngoại)

@inherits System.Web.Mvc.WebViewPage 
@Html.DropDownList("Category", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect()) 

và tất nhiên các kho lưu trữ

public static IEnumerable<SelectListItem> GetAppCategoriesSelect() 
    { 
     return (from p in GetAppCategories() 
       select new SelectListItem 
       { 
        Text = p.Name, 
        Value = p.ID.ToString(), 

       }); 
    } 


    public static ICollection<AppCategory> GetAppCategories() 
    { 
     var context = new LIGDataContext(); 
     return context.AppCategories.ToList(); 
    } 

Mỗi lần tôi thêm ứng dụng mới Nó sẽ tạo một AppC mới ategory Tôi chỉnh nghiêm túc này lên bằng cách nào đó


Thêm nhiều thông tin gỡ lỗi

@inherits System.Web.Mvc.WebViewPage 
@Html.DropDownList("", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect()) 

mang đến cho tôi một tin nhắn xác nhận về bài

Parameters application/x-www-form-urlencoded 
Category 1 
Name 8 

Validation lỗi Giá trị '1' không có hiệu lực.
Điều này có ý nghĩa vì Danh mục phải là đối tượng không phải là số nguyên.


điều khiển Mã như yêu cầu khá chắc chắn điều này isnt vấn đề như nó đến từ MVCScaffold

[HttpPost] 
    public ActionResult Create(App d) 
    { 
     if (ModelState.IsValid) 
     { 
      context.Apps.Add(d); 
      context.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(); 
    } 
+0

Tôi không có ý tưởng những gì câu hỏi của bạn là hoặc làm thế nào bạn nhận được một phiếu bầu tán thành cho bài viết. Bạn đã từng bước qua chương trình trong trình gỡ lỗi để thu hẹp bất cứ nơi nào có vấn đề xảy ra? –

+0

từ bộ điều khiển [HttpPost] công khai ActionResult Tạo (App d) Tôi nhận d.Category là null (thats lý do tại sao nó tạo ra một cái mới) nhưng tôi không biết tại sao tôi nhận được d.Category là null – MarkKGreenway

+0

Đăng mã điều khiển của bạn xin vui lòng. Tôi khá chắc chắn vấn đề là có. – jfar

Trả lời

5

mô hình của tôi đã sai thiết lập ... ICollection ảo và chỉ id chính nước ngoài cho các tiểu và tất cả mọi thứ đã làm việc ... thay đổi dưới đây

mẫu

public class AppCategory 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public **virtual** ICollection<App> Apps { get; set; } 
} 

public class App 
{ 
    public int ID { get; set; } 
    ******************************************** 
    [UIHint("AppCategory")] 
    public int AppCategoryID { get; set; } 
    ******************************************** 
    public string Name { get; set; } 

} 

public class LIGDataContext : DbContext 
{ 
    public DbSet<AppCategory> AppCategories { get; set; } 
    public DbSet<App> Apps { get; set; } 
} 

/Views/Shared/EditorTemplates/AppCateg ory.cshtml

@inherits System.Web.Mvc.WebViewPage 
@Html.DropDownList("", LIG2010RedesignMVC3.Models.Repo.GetAppCategoriesSelect()) 

AppController

[HttpPost] 
    public ActionResult Create(App d) 
    { 
     if (ModelState.IsValid) 
     { 
      this.repository.Add(d); 
      this.repository.Save(); 
      return RedirectToAction("Index"); 
     } 
     return View(); 
    } 
0

Nếu bạn ràng buộc DropDownList của bạn để Category.Id, bạn sẽ ít nhất có được giá trị được chọn vào đó đã nộp, nhưng không có gì khác trong đối tượng danh mục của bạn.

+0

Nó vẫn cố tạo đối tượng Danh mục mới – MarkKGreenway

0

Trình kết nối mô hình không thể tạo đối tượng AppCategory từ bộ sưu tập biểu mẫu trong hành động Create do biểu mẫu chỉ có ID cho đối tượng đó (các thuộc tính khác của AppCategory không có).

Giải pháp nhanh nhất sẽ được thiết lập Category tài sản của đối tượng App của bạn bằng tay, như thế này:

[HttpPost] 
public ActionResult Create(App d) { 
    int categoryId = 0; 
    if (!int.TryParse(Request.Form["Category"] ?? String.Empty, out categoryId) { 
     // the posted category ID is not valid 
     ModelState.AddModelError("Category", 
      "Please select a valid app category.") 
    } else { 
     // I'm assuming there's a method to get an AppCategory by ID. 
     AppCategory c = context.GetAppCategory(categoryID); 
     if (c == null) { 
      // couldn't find the AppCategory with the given ID. 
      ModelState.AddModelError("Category", 
       "The selected app category does not exist.") 
     } else { 
      // set the category of the new App. 
      d.Category = c; 
     } 
    } 
    if (ModelState.IsValid) 
    { 
     context.Apps.Add(d); 
     context.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 
Các vấn đề liên quan