【问题标题】:ASP.NET Core MVC Views Report model class does not have definition for new propertyASP.NET Core MVC 视图报告模型类没有新属性的定义
【发布时间】:2016-11-15 04:14:01
【问题描述】:

我正在开发一个 ASP.NET Core MVC 项目 (v.1.0.0)。它目前已发布到登台和生产环境。最近更新了其中一个模型类以添加两个新属性。

在开发和暂存环境中,这些新属性都运行良好。

但是,当部署到生产环境时,引用这些新属性的视图报告它们未在类中定义。在生产中:

1) Entity Framework 能够成功实现迁移并根据更新的类更新数据库架构。

2) 控制器能够与这些新属性进行交互,甚至可以保存到数据库中。

3) 但是,当对同一类使用强类型视图时,会引发错误,指出 Location 不包含 Latitude 的定义。

同样,相同的视图可以很好地与开发和暂存环境中的新属性配合使用。

Location.cs

public class Location
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    [Display(Name = "Address Line 1")]
    public string AddressLine1 { get; set; }
    [Display(Name = "Address Line 2")]
    public string AddressLine2 { get; set; }
    [Required]
    public string City { get; set; }
    [Required]
    public string State { get; set; }
    [Required]
    [Display(Name = "Postal Code")]
    public int PostalCode { get; set; }

    public double Latitude { get; set; }    // New
    public double Longitude { get; set; }   // New

    public string Notes { get; set; }

    public Boolean IsActive { get; set; }
    public Boolean IsDeleted { get; set; }
}

AddLocation.cshtml

我正在使用控制器从外部 API 获取提交时的纬度和经度,这就是为什么这些字段在 AddLocation 视图上被隐藏并默认为 0 的原因。用于更新或显示值的其他视图也会引发相同的错误。

@model MyMvcApp.Models.Location

@{
    ViewData["Title"] = "Add Location";
}

    <form asp-action="AddLocation">
        <div class="form-horizontal">
            <hr />
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Latitude" value="0" />
            <input type="hidden" asp-for="Longitude" value="0" />

            <div class="form-group">
                <label asp-for="Name" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="Name" class="form-control" />
                    <span asp-validation-for="Name" class="text-danger" />
                </div>
            </div>

            <div class="form-group">
                <label asp-for="AddressLine1" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="AddressLine1" class="form-control" />
                    <span asp-validation-for="AddressLine1" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <label asp-for="AddressLine2" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="AddressLine2" class="form-control" />
                    <span asp-validation-for="AddressLine2" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <label asp-for="City" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="City" class="form-control" />
                    <span asp-validation-for="City" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <label asp-for="State" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <select asp-for="State" asp-items="@ViewBag.StateList" class="form-control"></select>
                    <span asp-validation-for="State" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <label asp-for="PostalCode" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="PostalCode" class="form-control" />
                    <span asp-validation-for="PostalCode" class="text-danger" />
                </div>
            </div>

            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <div class="checkbox">
                        <input asp-for="IsActive" />
                        <label asp-for="IsActive"></label>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label asp-for="Notes" class="col-md-2 control-label"></label>
                <div class="col-md-10">
                    <input asp-for="Notes" class="form-control" />
                    <span asp-validation-for="Notes" class="text-danger" />
                </div>
            </div>
            <div class="form-group">
                <div class="col-md-offset-2 col-md-10">
                    <input type="submit" value="Add" class="btn btn-default" />
                </div>
            </div>
        </div>
    </form> 

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

当我删除或注释掉对新属性的引用时,视图渲染得很好。

有什么办法可以纠正这个问题吗?

【问题讨论】:

  • 您的模型类是否在其他库或与 Controller 和 View 相同的 Web 项目中?
  • 控制器和视图在同一个项目中。
  • 您确定新的 dll 正确构建并正确部署到生产环境。
  • @dotnetstep 它似乎是,但我不确定。之后我进行了多次构建和部署,没有任何变化。我什至在部署之前尝试过清理和重建,但没有任何变化。
  • 在我看来,您的 dll 未更新或被缓存或其他内容引用。如果可能,请尝试回收应用程序池。

标签: asp.net-core-mvc


【解决方案1】:

在这种情况下,视图的行为与控制器不同,因为它们是在运行时而不是在构建时编译的。

在我的例子中,早期版本的 dll 仍然位于托管服务器上的一个单独位置。我的猜测是,它是之前尝试回滚的结果。无论如何,旧版本的 dll 在主机上仍然可用,并在编译视图创建行为时访问。

理想情况下,我应该能够删除过时的 dll(以及任何相关文件)并重新启动应用服务。不幸的是,我找不到这个 dll,所以我选择了一条不太理想的路径。

为了更正此问题,我在部署设置中设置了“在目标位置删除其他文件”复选框,然后发布。 Web Deploy Settings

注意:任何生成或上传到与项目部署分开的 Web 服务器的文件也将被删除。如果其中任何一个存在,则需要重新生成或上传。

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2018-06-12
    • 2019-06-15
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多