1

我使用脚手架选项来创建一个SubscriptionController.
以下是一些代码片段:

In Controller:

public ActionResult Index()
{
    var subscriptions = db.Subscriptions;
    return View(subscriptions.ToList());
}

In View:

@model IEnumerable<Liquidity.Domain.Entity.Subscription>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Amount)
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Amount)
        </td>    
        </td>
    </tr>
}
</table>

For my subscription model, I have:

public decimal Amount { get; set; }

以下是我的问题:

  1. 我认为Model绑定到一个列表Subscription不是一个 Subscription身份,因为这表明:

    @foreach(模型中的变量项)

    这个对吗?

  2. 如果 1 是正确的,为什么在这一行:

    @Html.DisplayNameFor(model => model.Amount)

    模型会有Amount吗?这表明模型绑定到单个“订阅”。

  3. 对于这一行:

    @Html.DisplayFor(modelItem => item.Amount) modelItem 和 item 绑定到什么?为什么 lambda 接受 modelItem 但不使用它?

请解释模型,模型和模型项到底是什么。
谢谢。

4

1 回答 1

2
  1. 那是对的。
  2. 它正在使用DisplayNameFor. 这允许您从 IEnumerable 模型中获取单个项目以显示列标题等内容。
  3. modelItem是你的模特。 item来自foreach。这有点作弊,允许您使用DisplayFor助手。

更多关于第 3 项的信息。这对DisplayFor. 但是,如果您想制作可编辑的网格和EditorFor/ ,这将导致问题TextboxFor。Razor 将根据传入的表达式为生成的 HTML 分配名称。因此,表中的所有项目都将具有相同的名称。但是,要发布集合,名称必须包含索引,例如 Item[0].Amount, Item[1].Amount....

有两种选择可以完成这项工作。

首先,使用 afor而不是 a foreach。您需要将模型更改为支持索引器、IList、ICollection 等的模型。这看起来像。

@for(int i = 0; i < Model.Count; i++)
{
    <tr>
        <td>
            @Html.EditorFor(model=> model[i].Amount)
        </td>    
        </td>
    </tr>
}

或者,我更喜欢创建一个编辑器模板。在您的视图名称“EditorTemplates”中创建一个新文件夹。然后制作一个名为“Subscription.cshtml”的文件。该文件应如下所示

@model Subscription
<tr>
    <td>
        @Html.EditorFor(model=> model.Amount)
    </td>    
    </td>
</tr>

现在在您看来,您可以拥有

@Html.EditorFor(model => modle)

或者

@Html.EditorForModel()

razor 引擎足够智能,可以重新识别您的模型是一个集合,并且它将为集合中的每个项目呈现您的 EditorTemplate。此外,它会正确生成名称,因此您不必担心。使用这种方法,您也可以继续使用IEnumerable模型。

这也适用于 DisplayTemplates。您只需要将文件夹的名称更改为 DisplayTemplates 并使用DisplayFor而不是EditorFor.

于 2013-06-26T18:01:27.087 回答