我正在使用Razor视图引擎开发ASP.NET Core 2.0 Web应用程序。首先,我试图通过互联网和StackOverFlow寻找解决方案,但其中任何一个都可以解决我的问题。让我们看看我们面临的是什么:
我为客户提供了一个相对简单的视图模型:
namespace MokaKukaMap.Application.Customers.ViewModels.Models
{
public class CustomerViewModel
{
public long Id { get; set; }
[Display(Name = "Név")]
[Required]
public string Name { get; set; }
[Display(Name = "Telefonszám")]
[Required]
public string PhoneNumber { get; set; }
}
}
如您所见,Name
和PhoneNumber
属性指定了属性Display
。
我的相应部分视图(_NewCustomer.cshtml
)如下:
@model MokaKukaMap.Application.Customers.ViewModels.Models.CustomerViewModel
<div class="col-lg-5 basic-surronder">
<form asp-controller="NewCustomer" asp-action="NewCustomer" class="well">
<div id="form-horizontal">
<div class="form-group">
<label asp-for="@Model.Name" class=""></label>
<div class="">
<input asp-for="@Model.Name" class="form-control">
<span asp-validation-for="@Model.Name" class="text-danger"> </span>
</div>
</div>
<div class="form-group">
<label asp-for="@Model.PhoneNumber" class=""></label>
<div class="">
<input asp-for="@Model.PhoneNumber" class="form-control">
<span asp-validation-for="@Model.PhoneNumber" class="text-danger"> </span>
</div>
</div>
</div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<div class="">
<input type="submit" formnovalidate="formnovalidate" value="Új ügyfél hozzáadása" class="btn btn-primary" />
</div>
</div>
</form>
</div>
到目前为止一切顺利。正如我已经提到的那样,我将此视图用作局部视图,因此我将她包含在NewCustomer.cshtml
主视图中,其中包含以下行:
@Html.Partial("_NewCustomer")
_NewCustomer.cshtml
位于标准的Views / Shared文件夹中。我想做的是将此局部视图放入特定文件夹,即Customers / Views文件夹。为了解决这个问题,我制作了一个CustomerViewLocationExpander
,如下所示:
public class CustomViewLocationExpander : IViewLocationExpander
{
public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)
{
var viewLocationFormats = new[]
{
"~/Customers/Views/{0}.cshtml",
"~/Views/Shared/{0}.cshtml",
"~/Views/{0}.cshtml",
};
return viewLocationFormats;
}
public void PopulateValues(ViewLocationExpanderContext context)
{
context.Values["customviewlocation"] = nameof(CustomViewLocationExpander);
}
}
在Startup.cs中配置:
services.Configure<RazorViewEngineOptions>(options => options.ViewLocationExpanders.Add(new CustomViewLocationExpander()));
我的问题如下:如果_NewCustomer.cshtml
位于Views / Shared文件夹中,一切正常。但是,如果我将它放在我的自定义Customer / Views文件夹中,则不会显示/呈现属性的名称,并且验证属性也根本不起作用。呈现两个输入字段是因为我看到以下形式:
我已经尝试解决我的问题,(但没有一个帮助):
在启动时配置视图位置
services.Configure<RazorViewEngineOptions>(o => o.ViewLocationFormats.Add("/Customers/Views/{0}" + RazorViewEngine.ViewExtension));
包含局部视图时使用绝对路径:
@Html.Partial("~/Customers/Views/_NewCustomer.cshtml")
创建名为&#39;共享&#39;的文件夹在我的&#39;客户&#39;文件夹并将我的部分视图放在那里:客户/观点/共享
删除所有&#39; bin&#39;和&#39; obj&#39;文件夹,清理然后重建解决方案
此外,我意识到如果局部视图位于自定义文件夹中,则VS2017(IntelliSense)无法识别特定于asp-net-core的html标记,例如<form asp-controller=
未以绿色突出显示,仅当视图位于共享文件夹中时。
其他信息:
您认为问题出在哪里?谢谢你的帮助!