.NET Core:不呈现ViewModel属性

时间:2018-05-09 19:04:35

标签: c# razor asp.net-core

我正在使用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; }
    }
}

如您所见,NamePhoneNumber属性指定了属性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文件夹中,则不会显示/呈现属性的名称,并且验证属性也根本不起作用。呈现两个输入字段是因为我看到以下形式: enter image description here

我已经尝试解决我的问题,(但没有一个帮助):

  • 在启动时配置视图位置

    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=未以绿色突出显示,仅当视图位于共享文件夹中时。

其他信息:

我的文件夹结构如下所示: enter image description here

您认为问题出在哪里?谢谢你的帮助!

0 个答案:

没有答案