2011-02-19 21 views
11

कैसे बनाया गया मुझे इस पर कई लेख मिले लेकिन फिर भी मुझे नहीं पता कि यह वास्तव में कैसे करना है। मैं अपना ब्लॉग इंजन बनाने की कोशिश कर रहा हूं, मेरे पास आलेख बनाने के लिए व्यू है (मैं पहले ईएफ और कोड का उपयोग कर रहा हूं) और अब मुझे श्रेणी की संख्या भरनी होगी जिसमें लेख जोड़ना चाहिए, लेकिन मैं इसे ड्रॉपडाउन सूची में बदलना चाहता हूं श्रेणियाँ। मेरा मॉडल यह दिखता है:Asp.Net MVC3 - डायनेमिक ड्रॉपडाउनलिस्ट

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

} 

मुझे पता है कि मुझे Enum (या मुझे लगता है) का उपयोग करना चाहिए, लेकिन मुझे बिल्कुल यकीन नहीं है कि कैसे। मुझे नहीं पता कि मुझे जो ट्यूटोरियल मिला वह मेरे लिए सबसे अच्छा है।


संपादित करें:

अपने जवाब के लिए धन्यवाद, लेकिन मैं कुछ और ही पाया। मैं इस कोशिश कर रहा हूँ:

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

} 

यह लेख बनाने के लिए मेरी नियंत्रक है:

यह मेरा मॉडल है

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

    } 
} 

और यह मेरे विचार का हिस्सा है:

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

मुझे NullReferenceExeption के साथ समस्या है लेकिन मुझे नहीं पता क्यों। क्या मैं इसे इस तरह से कर सकता हूं? यह मेरे लिए बहुत आसान लग रहा है।

+0

बस jQuery UI के साथ बॉक्स से बाहर निकलने वाले व्यक्ति का उपयोग करें? – CarneyCode

उत्तर

20

आपका मॉडल काफी अजीब लगता है। इसमें CategoryID और Category जैसे गुण शामिल हैं जो अनावश्यक प्रतीत होते हैं। इसमें SelectListItem संग्रह संपत्ति भी शामिल है जिसे Categories कहा जाता है। तो, क्या यह एक मॉडल या दृश्य मॉडल है? यह काफी गड़बड़ लग रहा है। आइए मान लें कि यह एक मॉडल है। अब

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

} 

कि मॉडल स्पष्ट है हम जो दिखाई देने वाले को दे दिया जाएगा एक दृश्य के मॉडल को परिभाषित कर सकता है: इस मामले में यह अधिक संभावना यह कुछ ऐसा दिखाई देगा। एक व्यू मॉडल एक वर्ग है जिसे विशेष रूप से देखने के लिए डिज़ाइन किया गया है। तो इस दृष्टिकोण में जो आप डालना चाहते हैं उसके आधार पर आप इसे इस दृश्य मॉडल में परिभाषित करते हैं। अब तक आप केवल एक बूंद के बारे में नीचे में बात की है, तो चलिए इसे करते हैं:

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

और फिर हम एक नियंत्रक है:

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

तो नियंत्रक मॉडल लाने के लिए भंडार का उपयोग करता है, यह नक्शे एक दृश्य मॉडल (इस उदाहरण मैं AutoMapper का उपयोग में) करने के लिए और देखने जो यह दिखाने का ख्याल रखेंगे को देखने के मॉडल से गुजरता है:

@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

मेरा मानना ​​है कि श्रेणी आईडी और श्रेणी गुण अनावश्यक नहीं हैं। वह सिर्फ "श्रेणी आईडी" के रूप में विदेशी कुंजी नाम देने के लिए एंटिटी फ्रेमवर्क को बता रहा है, डिफ़ॉल्ट "श्रेणी_आईडी" नहीं जिसमें अंडरस्कोर है। – rajeemcariazo

4

मैं इस के माध्यम से रूप में अच्छी तरह से चले गए हैं और मैं सहमत होना होगा कि सबसे पहले यह अजीब लगता है (मेरी व्याख्या में मुझे लगता है कि आप केवल एक श्रेणी का चयन करना चाहते हैं, लेकिन प्रक्रिया बहु चयन के लिए बहुत समान है)।

1:

मूल रूप से आप 3 चरणों करने की आवश्यकता
आप अपने viewmodel वन पर दो गुणों की जरूरत चयनित श्रेणी आईडी (पोस्टबैक के लिए आवश्यक) का आयोजन करेगा और अन्य जाएंगी SelectList सभी के साथ संभव विभाग:

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

    public int CategoryID { get; set; } 

    public SelectList Categories { get; set; } 
} 

2:
भी देखने के लिए पर viewmodel पार करने से पहले आपप्रारंभ करने की आवश्यकता(सर्वश्रेष्ठ practivce दृश्य में एक मॉडल के पार करने से पहले जितना संभव हो उतना तैयार करने के लिए है):

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

3:
ध्यान में रखते हुए आप CategoryID संपत्ति के लिए एक ListBox जोड़ने की जरूरत है, लेकिन Categories संपत्ति का उपयोग कर ListBox को मूल्यों के साथ भी भरें:

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

यह है! नियंत्रक की पोस्ट बैक एक्शन में आपके पास श्रेणी आईडी सेट होगा। आप अपने डीबी में चीजों को जारी रखने के लिए वहां से जो भी कर सकते हैं वह कर सकते हैं।

संबंधित मुद्दे