【问题标题】:Html.Grid can't find a model property that is clearly thereHtml.Grid 找不到明显存在的模型属性
【发布时间】:2011-10-18 13:31:15
【问题描述】:

有问题的网格是一个简单的位置列表,基于此集合:

public class Locations : BaseGrid
{
    public string zipCode { get; set;}
    public string city { get; set; }
    public string state { get; set; }
    public string timeZone { get; set;}
    public IPagination<Location> LocationList { get; set; }
}

还有这个实体:

[DataContract] // DataContract/DataMember used for JsonSerializer
public class Location
{
    public int ID { get; set; }
    public string Address;
    public string AlternateSupportingLocationNumber;
    public string City;
    public string CompanyName;
    [DataMember]
    public string CTU;
    public string Description;
    public double Distance;
    [DataMember]
    public string LocationNumber;
    public string ManagerName;
    public string PhoneNumber;
    public string State;
    public string SupportingLocationNumber;
    public string TimeZone;
    public string ZipCode;
    public bool IsInPhysicalInventory;
    public bool IsEslOwned;
}

控制器,如下所示:

    public ActionResult NearestStoreCoverage( Locations locations )
    {
        if ( string.IsNullOrEmpty( locations.SortBy ) )
            locations.SortBy = "Distance";
        var list = _locationService.NearestStoreCoverage( locations, 50, ModelState );
        locations.LocationList = list.AsPagination(locations.Page ?? 1, list.Count);

        //go get locations that are close
        return View( "Details/NearestStoreCoverage", locations );

    }

获取视图的位置列表作为 Locations 模型的 LocationList 成员,并填充此控件:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Locations>" %>
<%@ Import Namespace="Models.Common"%>

<div class="detailSection" style="width:98%">
    <h1>Locations close to Zip Code -- <%=Model.zipCode %></h1>
    <div>
    <%= Html.Grid(Model.LocationList).Columns(column =>
         {
             column.For(x => x.LocationNumber)
                 .Named(Html.SortByLink("Location","LocationNumber"));
             column.For(x => x.Distance.ToString("N2")).Named(
                 Html.SortByLink("Distance", "Distance"));
             column.For(x => x.PhoneNumber.ToFormattedString()).
                 Named(Html.SortByLink("Phone Number",
                                       "PhoneNumber"));
             column.For(x => x.Address).Named(
                 Html.SortByLink("Address", "Address"));
             column.For(x => x.City).Named(
                 Html.SortByLink("City", "City"));
             column.For(x => x.State).Named(
                 Html.SortByLink("State", "State"));
             column.For(x => x.ZipCode).Named(
                 Html.SortByLink("ZipCode", "ZIpCode"));
         })
            .Attributes(style => "width:100%")
            .Attributes(id => "locationClosesttoZipGrid")
            .Empty("There are no locations close to this zipcode") %>
    <%= Html.Pager( Model.LocationList ).Link( page => Html.WritePageLink( page ) )%>
    </div>
</div>

运行时,运行时错误是

System.ArgumentException was unhandled by user code
  Message=The property Models.Common.Location.LocationNumber could not be found.
  Source=System.Web.Mvc
  InnerException:

(我删除了客户端的堆栈跟踪,反正很无聊)

但是,如果您调试并查看模型(这是来自 Html.Grid(Model.LocationList).Columns),您可以清楚地看到 LocationNumber 已填充:

A look at the Model in the debugger http://img839.imageshack.us/img839/6538/34gridresults.png

认为它不会变得陌生?如果我注释掉对 LocationNumber 的引用,调试器会允许距离和电话号码,然后在地址上再次失败(显然也存在)。

我已尝试重建,并已对所有相关符号进行 F12 操作,以确保它们到达我认为应该去的地方。

调试器不让我查看 x,这很糟糕。知道可能出了什么问题,或者至少如何开始查找?

【问题讨论】:

    标签: c# asp.net-mvc mvccontrib


    【解决方案1】:

    麻烦的属性被声明为字段

    显然,网格可以处理属性和方法调用:对它们进行方法调用的字段是正在工作的字段。看起来字段不起作用。

    (感谢 Craig Stuntz 指出这一点)

    【讨论】:

    • 这是有道理的,因为您使用不同的反射方法来读取字段、属性和方法。
    • 顺便说一句,我认为这也意味着网格没有使用 MVC 模型元数据提供程序,而是在中途重新发明了那个轮子。
    • 经过反思(没有双关语),我意识到我在不同的背景下遇到了这个问题。那时,我停止在类之外公开字段,而是在我通常使用字段时开始使用自动属性 ​​- 我正在以这种心态阅读这段代码(而不是它实际所说的)。尽管如此,我可能应该重新考虑何时应该暴露字段的边界条件。我也不相信永远不公开字段是要走的路。
    • 精彩的评论,先生们。很高兴有两个我认识的最聪明的开发者帮助我解决一个奇怪的问题!
    • 为了将来参考,我是如何导致此错误的(在进一步审查中)是将 Locations 的 LocationList 属性从服务层提供的数据合同更改为本地模型。这是从应用程序模型中获取数据合同引用的重构工作的一部分。出色的分析和感谢。
    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多