Reputation: 7818
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>
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
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
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