【问题标题】:Cannot get Editor Templates working in MVC3无法让编辑器模板在 MVC3 中工作
【发布时间】:2011-08-18 15:43:03
【问题描述】:

我正在将 MVC2 应用程序转换为 MVC3。 我似乎无法将视图与编辑器模板结合起来。 所以在我看来,代码是;

@model IEnumerable<ITOF.Models.LatestContractNumber>

@{
    ViewBag.Title = "EditContractNumbers";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

using (Html.BeginForm())
       {
    <fieldset>
        <legend>Edit Latest Contract Numbers</legend>
        <div style="width:90%">
            <div style="width:45%; float:left; vertical-align:top;">
                <p>A contract number is in a format: AA/B999</p>
                <p>Where AA is a 2 character code for the division, for example CD.</p>
                <p>Where B is a letter for the contract, usually the first letter of the contract title.</p>
                <p>999 is a 3 digit number.</p>
                <p>The 999 number depends on the B letter. </p>
                <p>Initially all the numbers start as 1 and are incremented each time the B letter is used.</p>
                <p>This pages sets the initial 999 number for each B letter.</p>
                <p>Once the application is up and running, this page should be used initially and then no more.</p>  
                @if (TempData["Message"] != null && TempData["Message"].ToString().Trim().Length > 0)
                  { 
                  <p class="success">@TempData["Message"].ToString()</p>
                  }         
            </div>
            <div style="width:45%; float:right; vertical-align:top;">
                <div>
                <table>
                    <tr>
                        <td>Letter</td>
                        <td>Number</td>
                    </tr>
                    @Html.EditorForModel(Model)
                </table>
                </div>
                <div style="padding-top:20px">
                    <input type="submit" value="Submit Changes" />
                </div>
            </div>
        </div>
    </fieldset>
    }

我的编辑器模板位于正确的文件夹中,现在看起来像;

@model ITOF.Models.LatestContractNumber
<tr>
    <td>
        @Html.HiddenFor(model => model.LatestContractNumberId)
        @Html.DisplayFor(model => model.Letter) 
    </td>

    <td>
        @Html.TextBoxFor(model => model.Number, new { style = "width:30px" })
    </td>
</tr>

@Html.EditorForModel(Model) 中的模型与页面顶部的@model IEnumerable 相关。 在编辑器模板中,这应该转换为 ITOF.Models.LatestContractNumber 的循环,因此我在模板的顶部放置了@model ITOF.Models.LatestContractNumber

【问题讨论】:

  • 当您说您的编辑器模板位于正确的文件夹中时,它到底在哪个文件夹中?
  • Editor Templates 文件夹,该文件夹又位于与视图相同的文件夹中。
  • EditorTemplate 文件的名称是什么?
  • 好问题!我养成了在名称前面以 _ 开头的每个局部视图的习惯,但对于名称必须与模型名称匹配的编辑器模板,这当然不起作用。所以我已将 _LatestContractNumber.cshtml 更改为 LatestContractNumber.cshtml,现在它可以工作了!如果您希望我奖励您正确的答案,请将其作为答案。
  • 您的@Html.EditorForModel(Model) 调用将模型作为附加视图数据传递——您不需要将模型传递给它。以_ 开头的模板是​​个好主意,因为最终用户永远不能直接请求任何以此开头的视图。此外,您可以将模板名称作为第一个参数传递给@Html.EditorForModel(),因此它变为@Html.EditorForModel("_LatestContractNumber")

标签: asp.net-mvc


【解决方案1】:

首先,您使用IEnumerable&lt;ITOF.Models.LatestContractNumber&gt; 类型的模型(这是您的视图的模型)调用EditorForModel,但您应该使用ITOF.Models.LatestContractNumber(这是您的模板希望看到/获取的模型)调用它)。你需要一个foreach 在里面的某个地方

foreach(ITOF.Models.LatestContractNumber number in Model) {
    @Html.EditorForModel(number)
}

其次,不是 100% 确定,但 EditorTemplates 应该位于 Views 文件夹下的 Shared 文件夹中。所以~/Views/Shared/EditorTemplates/,应该以类名命名,所以LatestContractNumber.cshtml

HTH

【讨论】:

  • 我认为这都是错误的,对不起!使用编辑器模板的要点之一是您不必使用 for 循环。 Editor Templates 文件夹可以与您的 View 位于同一文件夹中,也可以位于 Shared 文件夹中。如果模板将由不同文件夹中的视图使用,或者您认为将来可能会使用,则使用 Shared 文件夹。
【解决方案2】:

这个问题原来是一个红鲱鱼。真正的问题是,在迁移到 MVC 并开始使用 _ 为部分视图添加前缀后,编辑器模板的名称无效。 感谢 Russ Cam 提出了正确的问题,让我得到了答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多