关于 c#:IEnumerable 模型和在同一页面上创建字段

IEnumerable Model and Create Field on the Same Page

(这篇文章是糖果混淆的;混淆是因为我必须这样做,糖果给 lulz。相信我,真正的东西实际上是值得的。)

使用 ASP.NET MVC 4 和 EF 5,我正在尝试创建一个页面,该页面同时显示数据库中当前存在的实体列表和底部的简单创建字段。我有一种可行的方法,但我想知道是否有更好的方法,因为我目前的方法感觉很迂回。我会上传一张我所拥有的图片,但我必须至少有十个声望,所以...继续发帖。

我传入的模型是这样的:

1
2
3
4
5
6
7
8
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 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
}

我的看法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@model IEnumerable<CandyDatabase.Models.CandyBrands>

@{
    ViewBag.Title ="Brands";
}

Brands

<p>@Html.DisplayNameFor(m => m.Name)</p>

@foreach (var brand in Model)
{
    <p>@Html.DisplayFor(m => brand.Name)</p>
}


Create New

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <p><center>[wp_ad_camp_2]</center></p><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"脚本;此脚本的存在仅通过运行

来解决此问题

1
$("input[type!='submit']").val("");

在页面加载时清除所有字段。

有没有更好的方法来做到这一点?我并没有接受"使用视图模型,dangit!"的答案,但是拥有一个具有 CandyBrand 实体和 CandyBrand 实体列表的视图模型似乎很愚蠢。


所以,根据 Henk Holterman 的说法,它看起来

A ViewModel is the actual, simple and clear solution here. Nothing silly about it.

和达林·季米特洛夫

Dude, use a view model, dangit! How else are you even thinking in being able to write an ASP.NET MVC application that actually works? Without a view model? I have never seen such a beast released in the wild yet. Coz that ain't gonna happen. The very first thing you should start thinking before even writing a single line of code from your application is how your view models are gonna look like.

答案是视图模型。谢谢你们的帮助;以后,我将使用视图模型,dangit!