(この投稿はキャンディーで難読化されています。難読化されているのは、私がしなければならないからです。念のためのキャンディーです。信じてください。本物には実際に価値があります。)
ASP.NET MVC 4 と EF 5 を使用して、現在データベースに存在するエンティティのリストと下部の単純な作成フィールドを同時に表示するページを作成しようとしています。私はそれを行う機能的な方法を持っていますが、私の現在の方法は非常に回り道をしているので、もっと良い方法があるかどうか疑問に思っています. 私が持っているものの画像をアップロードしますが、少なくとも 10 の評判が必要なので、投稿に進みます.
私が渡しているモデルは次のようになります。
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 を呼び出して、1 つのエントリにまとめています。これはそれ自体が面倒ですが、それだけではありません。次に、MVC は自動的に (そして望ましくなく (単語である場合とそうでない場合があります))、モデル内の最初のエンティティからのデータをエディターに入力します! 一番下に「clear-inputs」スクリプトの呼び出しがあります。このスクリプトは、実行してこの問題を修正するためだけに存在します
$("input[type!='submit']").val("");
ページの読み込み時にすべてのフィールドをクリアします。
これを行うより良い方法はありますか?「ビューモデルを使用してください、ダンギット!」という答えを受け入れる以上ではありませんが、CandyBrandエンティティとCandyBrandエンティティのリストを持つビューモデルを持つのはばかげているようです。