2011-02-19 58 views
11

Tôi đã tìm thấy nhiều bài viết về điều này nhưng tôi vẫn chưa biết chính xác cách thực hiện điều này. Tôi đang cố gắng tạo công cụ blog của riêng mình, tôi có Xem để tạo bài viết (Tôi đang sử dụng EF và Mã đầu tiên) và bây giờ tôi phải điền vào số hạng mục cần thêm nhưng tôi muốn thay đổi nó thành danh sách thả xuống với tên Thể loại. Mô hình của tôi trông như sau:Asp.Net MVC3 - Cách tạo Dynamic DropDownList

public class Article 
{ 
    public int ArticleID { get; set; } 
    [Required] 
    public string Title { get; set; } 
    [Required] 
    public int CategoryID { get; set; } 
    public DateTime Date { get; set; } 
    [Required()] 
    [DataType(DataType.MultilineText)] 
    [AllowHtml] 
    public string Text { get; set; } 
    public virtual Category Category { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
    public virtual ICollection<Comment> Comments { get; set; } 
} 
public class Category 
{ 
    public int CategoryID { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public virtual ICollection<Article> Articles { get; set; } 

} 

Tôi biết tôi phải sử dụng Enum (hoặc tôi nghĩ) nhưng tôi không chắc chắn như thế nào. Tôi không biết hướng dẫn nào mà tôi thấy là tốt nhất cho tôi.


Edit:

Cám ơn câu trả lời của bạn, nhưng tôi thấy cái gì khác. Tôi đang cố gắng này:

Đây là mô hình của tôi:

public class Article 
{ 
    [Key] 
    public int ArticleID { get; set; } 

    [Display(Name = "Title")] 
    [StringLength(30, MinimumLength = 5)] 
    [Required] 
    public string Title { get; set; } 

    public DateTime Date { get; set; } 

    public int CategoryID { get; set; } 

    [Required()] 
    [DataType(DataType.MultilineText)] 
    [AllowHtml] 
    public string Text { get; set; } 

    public Category Category { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 

    public IEnumerable<Category> Categories { get; set; } 
} 
public class Category 
{ 
[Key] 
    public int CategoryId { get; set; } 
    [Required] 
public string CategoryName { get; set; } 
    public virtual ICollection<Article> Articles { get; set; } 

} 

Đây là bộ điều khiển của tôi để tạo bài viết:

public ActionResult Vytvorit() 
{ 
    IEnumerable<Category> categories = GetCaregories(); 
    var view = View(new Article() { Categories = categories }); 
    view.TempData.Add("Action", "Create"); 

    return view; 

} 

private static IEnumerable<Category> GetCaregories() 
{ 
    IEnumerable<Category> categories; 
    using (BlogDBContext context = new BlogDBContext()) 
    { 
     categories = (from one in context.Categories 
         orderby one.CategoryName 
         select one).ToList(); 
    } 
    return categories; 
} 

private Category GetCategory(int categoryID) 
{ 
     return db.Categories.Find(categoryID); 
} 
// 
// POST: /Clanky/Vytvorit 

[HttpPost] 
public ActionResult Vytvorit(Article newArticle) 
{ 

    try 
    { 
     if (newArticle.CategoryID > 0) 
     { 
      newArticle.Category = GetCategory(newArticle.CategoryID); 
     } 
     if (TryValidateModel(newArticle)) 
     { 
       db.Articles.Add(newArticle); 
       db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     else 
     { 
      newArticle.Categories = GetCaregories(); 
      var view = View(newArticle); 
      view.TempData.Add("Action", "Create"); 
      return view; 
     } 
    } 
    catch 
    { 
     return View(); 

    } 
} 

Và đây là một phần của quan điểm của tôi:

 @Html.DropDownListFor(model => model.CategoryID, new SelectList(Model.Categories,"CategoryID","CategoryName")) 
     @Html.ValidationMessageFor(model => model.CategoryID) 

Tôi có vấn đề với NullReferenceExeption nhưng tôi không biết tại sao. Tôi có thể làm theo cách này không? Nó trông rất dễ dàng đối với tôi.

+0

Chỉ cần sử dụng ứng dụng bạn thoát khỏi hộp với giao diện người dùng jQuery? – CarneyCode

Trả lời

20

Mô hình của bạn có vẻ khá lạ. Nó chứa các thuộc tính như CategoryIDCategory dường như không cần thiết. Nó cũng chứa một thuộc tính bộ sưu tập SelectListItem được gọi là Categories. Vậy đây có phải là mô hình hoặc mô hình xem không? Có vẻ khá sai lầm. Giả sử nó là một mô hình. Trong trường hợp này, nhiều khả năng nó sẽ trông giống như sau:

public class Article 
{ 
    public int ArticleID { get; set; } 

    [Required] 
    public string Title { get; set; } 

    public DateTime Date { get; set; } 

    [Required()] 
    [DataType(DataType.MultilineText)] 
    [AllowHtml] 
    public string Text { get; set; } 

    public virtual Category Category { get; set; } 

    public IEnumerable<Category> Categories { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
} 

public class Category 
{ 
    public int CategoryID { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<Article> Articles { get; set; } 

} 

Bây giờ, mô hình rõ ràng là chúng tôi có thể xác định mô hình xem sẽ được chuyển đến chế độ xem. Mô hình chế độ xem là một lớp được thiết kế riêng cho chế độ xem. Vì vậy, tùy thuộc vào những gì bạn định đưa vào khung nhìn này, bạn định nghĩa nó trong mô hình khung nhìn này. Cho đến nay bạn đã nói chỉ về một danh sách thả xuống, vì vậy chúng ta hãy làm điều đó:

public class ArticleViewModel 
{ 
    public int SelectedCategoryId { get; set; } 
    public IEnumerable<SelectListItem> Categories { get; set; } 
} 

và sau đó chúng ta có một bộ điều khiển:

public class ArticlesController: Controller 
{ 
    private readonly IArticlesRepository _repository; 
    public ArticlesController(IArticlesRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     Article article = _repository.GetArticle(); 
     ArticleViewModel viewModel = Mapper.Map<Article, ArticleViewModel>(article); 
     return View(viewModel); 
    } 
} 

Vì vậy, bộ điều khiển sử dụng một kho lưu trữ để lấy mô hình, bản đồ nó đến một mô hình view (trong ví dụ này tôi sử dụng AutoMapper) và vượt qua mô hình điểm để quan điểm đó sẽ chăm sóc nó cho thấy:

@model AppName.Models.ArticleViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.DropDownListFor(
     x => x.SelectedCategoryId, 
     new SelectList(Model.Categories, "Value", "Text"), 
     "-- Select category --" 
    ) 
    <input type="submit" value="OK" /> 
} 
+1

Tôi tin rằng các thuộc tính CategoryID và Category không thừa. Ông chỉ nói với Entity Framework đặt tên cho khóa ngoại là "CategoryID", không phải là "Category_ID" mặc định có dấu gạch dưới. – rajeemcariazo

4

tôi đã trải qua này là tốt và tôi phải đồng ý mà lúc đầu nó có vẻ kỳ lạ (Trong lời giải thích của tôi, tôi giả sử bạn muốn chọn một danh mục duy nhất, nhưng quá trình này rất giống với một lựa chọn đa).

Về cơ bản bạn cần phải thực hiện 3 bước:

1:
Bạn cần hai thuộc tính trên viewmodel của bạn Một sẽ giữ id danh mục được lựa chọn (cần thiết cho postback) và người kia sẽ một SelectList với tất cả category có sẵn:

public class Article 
{ 
    public int ArticleID { get; set; } 

    public int CategoryID { get; set; } 

    public SelectList Categories { get; set; } 
} 

2:
Ngoài ra trước khi đi qua viewmodel trên để xem bạn cần phải khởi tạo.210 (practivce tốt nhất là để chuẩn bị càng nhiều càng tốt trước khi đi qua một mô hình thành quan điểm):

new SelectList(allCategories, "CategoryID", "Name", selectedCategoryID) 

3:
Trong giao diện bạn cần phải thêm một ListBox cho CategoryID bất động sản, nhưng sử dụng Categories bất động sản quá điền vào ListBox với các giá trị:

@Html.ListBoxFor(model => model.CategoryID , Model.Categories) 

Thats it! Trong hành động post back của controller bạn sẽ có tập CategoryID. Bạn có thể làm bất cứ điều gì bạn cần từ đó để tồn tại những thứ trong db của bạn.

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