ASP.NET MVC 5.1 EditorFor和DisplayFor不使用自定义模板 [英] ASP.NET MVC 5.1 EditorFor and DisplayFor not Using Custom Templates
问题描述
突然,我的MVC应用程序停止使用我拥有的自定义EditorFor
或DisplayFor
模板.由于我一直在更改用户界面,因此我不确定它什么时候会失败.我的模板位于Shared
文件夹下的DisplayTemplates
和EditorTemplates
中.我确实使用以下方法覆盖了Global.asax
中的ViewEnginesCollection
:
suddenly my MVC application stopped using the custom EditorFor
or DisplayFor
templates I have. I'm not sure when exactly it failed since I've been changing the UI. I have the templates sitting in DisplayTemplates
and EditorTemplates
under the Shared
folder. I do override the ViewEnginesCollection
in Global.asax
with this:
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CSHtmlRazorViewEngine {
PartialViewLocationFormats = new string[] {
"~/Views/Shared/EditorTemplates/{0}.cshtml",
"~/Views/Shared/Partials/{0}.cshtml"
}
});
CSHtmlRazorViewEngine
所在的位置:
public sealed class CSHtmlRazorViewEngine : RazorViewEngine {
public CSHtmlRazorViewEngine()
: base() {
this.AreaViewLocationFormats = new string[2] {
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml"
};
this.AreaMasterLocationFormats = new string[2] {
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml"
};
this.AreaPartialViewLocationFormats = new string[2] {
"~/Areas/{2}/Views/{1}/{0}.cshtml",
"~/Areas/{2}/Views/Shared/{0}.cshtml"
};
this.ViewLocationFormats = new string[3] {
"~/Views/{0}.cshtml",
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml"
};
this.MasterLocationFormats = new string[2] {
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml"
};
this.PartialViewLocationFormats = new string[2] {
"~/Views/{1}/{0}.cshtml",
"~/Views/Shared/{0}.cshtml"
};
this.FileExtensions = new string[1] {
"cshtml"
};
}
}
我很难理解突然哪里出错了.关于在哪里检查什么的任何建议?
I'm having a bit of a hard time understanding where I've gone wrong all of the sudden. Any recommendations on where to check for what?
更新-代码示例
这是Office
对象的Edit.cshtml
页面:
<div class="Section">
@using (Html.BeginForm("Edit", "Offices", new {
id = Model.Office.Id
}, FormMethod.Post)) {
<div>
<input type="submit" value="Save" />
</div>
@Html.EditorFor(m => m.Office, new {
Regions = Model.Regions,
States = Model.States
})
}
@Html.Partial("Equipments", Model.Equipments)
</div>
这是所请求的Office
的EditorFor
模板:
@model Office
<p>
@Html.Label("Name", "Name:")
@Html.TextBox("Name", Model.Name, new {
required = string.Empty
})
</p>
<p>
@Html.Label("RegionId", "Region:")
@Html.DropDownList("RegionId", new SelectList((IEnumerable<Region>)ViewData["Regions"], "Id", "Name", Model.RegionId), string.Empty, new {
required = string.Empty
})
</p>
@Html.EditorFor(m => m.Address)
这是OfficesController.Edit() ActionResult
:
[HttpGet]
public async Task<ActionResult> Edit(
short id) {
if (id > 0) {
Office office = await base.Repository.FindSingleOrDefaultAsync<Office, short>(id);
if (office != null) {
Task<IQueryable<Equipment>> equipments = Task.Run(() => base.Repository.FindEquipment<Office>(id));
Task<IQueryable<Region>> regions = Task.Run(() => base.Repository.Find<Region>());
Task<IQueryable<State>> states = Task.Run(() => base.Repository.Find<State>());
await Task.WhenAll(equipments, regions, states);
return base.View(new OfficesView {
Equipments = equipments.Result.ToList(),
Office = office,
Regions = regions.Result,
States = states.Result,
ViewData = new OfficeViewData {
Map = new Map {
Center = office.Address.Position.ToPoint(),
Polygons = (office.Boundaries != null) ? new Polygon[] {
office.Boundaries.ToPolygon()
} : null
}
}
});
}
}
return base.RedirectToAction("List");
}
没有生成任何编译或运行时异常. EditorFor
只是默默地找不到模板,而是生成默认模板.代码模式几乎对其他每个对象都重复.
There are no compilation or run-time exceptions being generated. The EditorFor
just silently fails to find the template and generates the default one instead. The code pattern pretty much repeats for every other object.
推荐答案
在寻找编辑器模板时,MVC会将EditorTemplates/
段本身添加到部分视图名称中.您可以在此处的代码中检查 ,ExecuteTemplate函数.
MVC will add itself the EditorTemplates/
segment to the partial view name when looking for an editor template. You can check the source code here, ExecuteTemplate function.
您已将部分视图位置设置为:
You have set the partial view locations as:
"~/Views/Shared/EditorTemplates/{0}.cshtml"
"~/Views/Shared/Partials/{0}.cshtml"
寻找Address
编辑器模板时,MVC将使用EditorTemplates/Address
作为部分视图名称.这意味着它将检查以下两个局部视图位置:
When looking for the Address
editor template, MVC will use EditorTemplates/Address
as the partial view name. That means it will check the 2 following partial view locations:
~/Views/Shared/EditorTemplates/EditorTemplates/Address.cshtml
~/Views/Shared/Partials/EditorTemplates/Address.cshtml
如果无法在此处找到它们,它将返回默认的编辑器模板.
If it cannot find them there, it will go back the default editor templates.
您的编辑器模板当前可能位于第一个EditorTemplates文件夹中?
Probably your editor templates are sitting currently in the first EditorTemplates folder?
这篇关于ASP.NET MVC 5.1 EditorFor和DisplayFor不使用自定义模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!