6

我正在尝试为重复类(优惠)设置 EditorTemplate - 但是,我无法让 EditorTemplate 显示。就好像在 EditorTemplates 文件夹中找不到它:

我的视图模型是:

    public class CreateViewModel
    {
    public IList<OfferVM> Offers { get; set; }
    public OfferVM Header
    {
        get
        {
            return Offers.FirstOrDefault();
        }
    }
}

public class OfferVM
{
    public int RoomTypeId { get; set; }
    public int PropertyId { get; set; }
    public string RoomTypeName { get; set; }
    public string Layout { get; set; }
    public decimal RoomRate { get; set; }
    public string Inclusions { get; set; }
    public string Property { get; set; }
    public bool IncludeInOffer { get; set; }
    }

我的控制器获取代码是:

    //
    // GET: /Offer/Create

    public ActionResult Create()
    {
        
        var roomtypes = db.RoomTypes.Include(r => r.Property).ToList();
        var vm = new CreateViewModel();
        vm.Offers = Mapper.Map<IList<RoomType>, IList<OfferVM>>(roomtypes);
       return View(vm);
    }

控制器工作正常 - 我可以看到它填充在 VS 中。

我的 Create.cshtml 代码是:

@model FGBS.ViewModels.CreateViewModel
@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.Bootstrap().Begin(new Form().Type(FormType.Horizontal))) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)

<fieldset>
    <legend></legend>


<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.RoomTypeId)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.PropertyId)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.RoomTypeName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Layout)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.RoomRate)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Inclusions)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Property)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.IncludeInOffer)
    </th>
    <th></th>
    </tr>

      @Html.EditorFor(x => x.Offers) 

    </table>

然后在我的 Views/Shared/EditorTemplates 文件夹中有我的 Offers.cshtml 文件:

@model FGBS.ViewModels.OfferVM

@{
    Layout = null;
}
  <tr>
    <td>
        @Html.EditorFor(model => model.RoomTypeId)
        @Html.ValidationMessageFor(model => model.RoomTypeId)
    </td>

   
    <td>
        @Html.EditorFor(model => model.PropertyId)
        @Html.ValidationMessageFor(model => model.PropertyId)
    </td>

    
    <td>
        @Html.EditorFor(model => model.RoomTypeName)
        @Html.ValidationMessageFor(model => model.RoomTypeName)
    </td>

    
    <td>
        @Html.EditorFor(model => model.Layout)
        @Html.ValidationMessageFor(model => model.Layout)
    </td>

   
    <td>
        @Html.EditorFor(model => model.RoomRate)
        @Html.ValidationMessageFor(model => model.RoomRate)
    </td>

   
    <td>
        @Html.EditorFor(model => model.Inclusions)
        @Html.ValidationMessageFor(model => model.Inclusions)
    </td>

   
    <td>
        @Html.EditorFor(model => model.Property)
        @Html.ValidationMessageFor(model => model.Property)
    </td>

    
    <td>
        @Html.EditorFor(model => model.IncludeInOffer)
        @Html.ValidationMessageFor(model => model.IncludeInOffer)
  </td>

    </tr>

ss

但是,当我运行代码时,我没有收到任何错误,但我的模板没有显示。

我尝试将模板更改为:

<tr><td>test</td></tr>

但它仍然不显示 - 这表明 EditorFor 没有在 editortemplates 文件夹中“找到” Offers.cshtml 文件。

我也尝试在 Offers.cshtml 中添加断点,但 VS 并没有在其中停止,这意味着它没有被击中。

我的设置或 Offers.cshtml 文件的位置有什么问题吗?

谢谢,

标记

4

2 回答 2

14

为未来的访客提供答案:

正如另一个问题中所述,默认情况下,EditorFor帮助程序使用名称与正在编辑的类型的名称匹配的模板。所以在这里,你的模板没有被使用,因为它的名字Offers与 viewmodel 的类型不匹配OfferVM。另一种方法是使用属性标记您想要EditorFor[UIHint("TemplateName")]属性,其中TemplateName是您的编辑器模板的名称,在这种情况下为Offers.

于 2013-07-03T15:04:25.700 回答
0

我有点晚了,但这会有所帮助。

您可以像这样包含模板名称。我用这个:

@Html.EditorFor(model => model.DateOfBirth, "DateTime", new { htmlAttributes = new { @class = "form-control" } })

你用引号写你的模板。

在你的情况下会是这样的

@Html.EditorFor(model => model.RoomTypeName, "Offer")。

确保 Offer 模板期望您在 EditorFor 中发送的类型(@model 类型)

希望这有帮助

于 2017-10-27T00:48:13.510 回答