Mark
Mark

Reputation: 7818

ASP.Net C# MVC EditorFor Template not being called from main razor view

I'm trying to setup an EditorTemplate for a repeating class (Offer) - however, I'm having trouble getting the EditorTemplate to show. It's as if it just isn't being found in the EditorTemplates folder:

My ViewModel is:

    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; }
    }

My Controller Get code is:

    //
    // 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);
    }

The controller works fine - I can see it populated in VS.

My Create.cshtml code is:

@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>

Then in my Views/Shared/EditorTemplates folder I have my Offers.cshtml file:

@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

However, when I run the code, I get no error, but my template doesn't display.

I have tried changing the template to just have:

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

But it still doesn't display - which suggests the EditorFor is not "finding" the Offers.cshtml file in the editortemplates folder.

I have also tried adding a breakpoint in Offers.cshtml, but VS doesn't stop within it, implying it isn't being hit.

Is there anything wrong with my setup, or the placement of the Offers.cshtml file?

Thank you,

Mark

Upvotes: 6

Views: 7201

Answers (2)

luis
luis

Reputation: 66

I litle bit late but I this would help.

you could include the template name like this. I used this:

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

you write in quotes your template.

In your case would be something like this

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

Make sure Offer template expect the type (@model type) you are sending within the EditorFor

Hope this help

Upvotes: 0

anaximander
anaximander

Reputation: 7140

To provide an answer for future visitors:

As noted in this other question, by default, the EditorFor helper uses the template whose name matches the name of the type being edited. So here, your template not being used because its name Offers did not match the viewmodel type of OfferVM. An alternative is to mark the property you want an EditorFor for with the [UIHint("TemplateName")] attribute, where TemplateName is the name of your editor template, which in this case would be Offers.

Upvotes: 15

Related Questions