(这篇文章是糖果混淆的;混淆了,因为我必须,糖果为lulz。相信我,真实的东西实际上是值得的。)
使用ASP.NET MVC 4和EF 5,我正在尝试创建一个页面,该页面同时显示数据库中当前存在的实体列表以及底部的简单创建字段。我有一个有效的方法,但我想知道是否有更好的方法,因为我现在的感觉非常迂回。我上传了一张我所拥有的图片,但我必须至少有十个声誉,所以...在帖子上。
我传入的模型看起来像这样:
public class CandyBrand
{
public int ID { get; set; }
[Required(ErrorMessage = "Brand name is required.")]
[Display(Name = "Brand Name")]
public string Name { get; set; }
}
控制器看起来像这样,包括GET和POST方法:
public ActionResult CandyBrands()
{
return View(context.CandyBrands);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CandyBrands(CandyBrand brand)
{
if (ModelState.IsValid)
{
context.CandyBrands.Add(brand);
context.SaveChanges(); //try/catch block removed for brevity
}
return View(db.CandyBrands);
}
我的观点:
@model IEnumerable<CandyDatabase.Models.CandyBrands>
@{
ViewBag.Title = "Brands";
}
<h2>Brands</h2>
<p>@Html.DisplayNameFor(m => m.Name)</p>
@foreach (var brand in Model)
{
<p>@Html.DisplayFor(m => brand.Name)</p>
}
<h3>Create New</h3>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<p>@Html.EditorFor(m => m.FirstOrDefault().Name) <input type="submit" value="Create" /></p>
<p>@Html.ValidationMessageFor(m => m.FirstOrDefault().Name)</p>
}
<p>@Html.ActionLink("Back to Candy List", "Index", "Home")</p>
@section Scripts{
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("/Scripts/clear-inputs.js")
}
因为我传递了糖果品牌列表,所以该模型采用IEnumerable类型。这对前半部分来说不是问题 - foreach循环会解决这个问题。但是,这会在页面下方产生其他问题。因为模型是IEnumerable,Html.EditorFor不喜欢它。目前,为了解决这个问题,我正在调用FirstOrDefault,它将其归结为一个条目。这本身就很烦人,但它并不止于此; MVC然后自动(和不需要的(可能是或可能不是一个单词))用编辑器中的第一个实体的数据填充编辑器!如果您在底部注意到,则会调用“clear-inputs”脚本;此脚本完全存在以通过运行
来解决此问题$("input[type!='submit']").val("");
清除页面加载时的所有字段。
有更好的方法吗?我不是接受“使用视图模型,dangit!”的答案,但是拥有一个拥有CandyBrand实体的视图模型然后是一个CandyBrand实体列表似乎很愚蠢。
答案 0 :(得分:0)
据Henk Holterman所说,似乎是这样
ViewModel是一个实际,简单,清晰的解决方案。没什么可傻的。
和Darin Dimitrov
伙计,使用视图模型,dangit!你怎么能想到能够编写实际有效的ASP.NET MVC应用程序呢?没有视图模型?我从未见过如此野兽在野外释放过。因为这不会发生。在编写应用程序中的单行代码之前,您首先要考虑的是视图模型的外观。
答案是视图模型。谢谢你的帮助;从此以后,我将使用视图模型,dangit!