ASP.NET MVC 5.1 EditorFor和DisplayFor不使用自定义模板 [英] ASP.NET MVC 5.1 EditorFor and DisplayFor not Using Custom Templates

查看:108
本文介绍了ASP.NET MVC 5.1 EditorFor和DisplayFor不使用自定义模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

突然,我的MVC应用程序停止使用我拥有的自定义EditorForDisplayFor模板.由于我一直在更改用户界面,因此我不确定它什么时候会失败.我的模板位于Shared文件夹下的DisplayTemplatesEditorTemplates中.我确实使用以下方法覆盖了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>

这是所请求的OfficeEditorFor模板:

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

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆