1

(この投稿はキャンディーで難読化されています。難読化されているのは、私がしなければならないからです。念のためのキャンディーです。信じてください。本物には実際に価値があります。)

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エンティティのリストを持つビューモデルを持つのはばかげているようです。

4

1 に答える 1