創建字段(這篇文章是糖果模糊;模糊的,因爲我要糖果的lulz相信我,真實的東西其實是值得的)IEnumerable的模式和在同一頁上
使用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然後自動(並且不想要的(可能是或不可能是一個單詞))使用模型中第一個實體的數據填充編輯器!如果您注意到底部,則會調用「清晰輸入」腳本;此腳本僅適用於通過運行來解決此問題
$("input[type!='submit']").val("");
當頁面加載時清除所有字段。
有沒有更好的方法來做到這一點?我並沒有在上面接受「使用視圖模型,dangit!」的答案,但是看起來有一個CandyBrand實體和一個CandyBrand實體列表的視圖模型似乎很愚蠢。
在您的POST,而不是返回視圖,我會重定向到GET。這將解決明顯的問題。 –
ViewModel是這裏實際的,簡單明瞭的解決方案。沒有什麼可笑的。 –
夥計,使用視圖模型,dangit!你甚至可以在寫一個實際上可以工作的ASP.NET MVC應用程序時想到其他什麼?沒有視圖模型?我從來沒有見過這樣的野獸在野外釋放。這不會發生。在應用程序編寫一行代碼之前,您應該首先考慮的第一件事是您的視圖模型將如何看起來像。 –