gpt4 book ai didi

asp.net-mvc-3 - Asp.Net MVC3 - 如何创建动态 DropDownList

转载 作者:行者123 更新时间:2023-12-04 01:37:13 25 4
gpt4 key购买 nike

我找到了很多关于这方面的文章,但我仍然不知道如何做到这一点。我正在尝试创建我自己的博客引擎,我有创建文章的 View (我首先使用 EF 和代码),现在我必须填写应添加文章的类别数,但我想将其更改为带有名称的下拉列表类别。我的模型看起来像这样:

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

}

这是我创建文章的 Controller :
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 有问题,但我不知道为什么。我可以这样做吗?对我来说看起来很容易。

最佳答案

你的模型看起来很奇怪。它包含诸如 CategoryID 之类的属性。和 Category这似乎是多余的。它还包含一个 SelectListItem集合属性称为 Categories .那么,这是模型还是 View 模型?看起来很乱。让我们假设它是一个模型。在这种情况下,它更有可能看起来像这样:

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

}

现在模型很清楚了,我们可以定义一个 View 模型,它将传递给 View 。 View 模型是专门为 View 设计的类。因此,根据您打算在此 View 中放置的内容,您可以在此 View 模型中定义它。到目前为止,您只讨论了下拉菜单,所以让我们这样做:
public class ArticleViewModel
{
public int SelectedCategoryId { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
}

然后我们有一个 Controller :
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);
}
}

因此 Controller 使用存储库来获取模型,将其映射到 View 模型(在本例中我使用 AutoMapper )并将 View 模型传递给将负责显示它的 View :
@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" />
}

关于asp.net-mvc-3 - Asp.Net MVC3 - 如何创建动态 DropDownList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5049485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com