c# - .Net OData v4 客户端生成 - IDataErrorInfo

标签 c# odata asp.net-web-api2 odata-v4

我已经使用 OData 客户端生成器创建了一个 OData v4 客户端。这生成了部分类。我想用 IDataErrorInfo 扩展这个生成的类。

namespace Client.Model {
    public partial class City : IDataErrorInfo
    {
        public String this[String columnName]
        {
            return "";
        }

        public String Error { get { return ""; } }
    }
}

当我想创建一个新城市并将其发送到服务器时

ODataContainer container = new ODataContainer(new Uri("http://localhost:45666/odata"));
container.AddToCities(city);

我得到一个错误

An exception of type 'Microsoft.OData.Client.DataServiceRequestException' occurred in Microsoft.OData.Client.dll.

The request is invalid. The property "Error" does not exist in Server.Model.City.

WebApi 配置:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<City>("Cities");
        builder.EntitySet<Country>("Countries");

        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: "odata",
            model: builder.GetEdmModel());
    }
}

是否有可能阻止 Error 属性被包含在请求中?

最佳答案

OData 客户端生成的模型是分部类。当您实现 IDataErrorInfo 时,它会要求您实现 Error 属性,当然服务器端不存在该属性。因为你做了一个操作,例如在实体 City 上,这会序列化 City 对象,如果有 Error 属性,它也会被序列化。

一个解决方案可能是,避免这种情况并将客户端模型与 UI 分开。你可以试试这个:

namespace Client.Model {
    public partial class City
    {
        public String this[String columnName]
        {
            return "";
        }
    }
}

使用继承来创建 UI 相关的模型类,与生成的模型类分开:

namespace UI.Model {
    public class City : Client.Model.City, IDataErrorInfo
    {
        public String Error { get { return ""; } }
    }
}

确保您在 UI 上使用 UI.Model.City,并且当您为添加操作调用 OData 服务时,对 UI.Model.City 类对象执行显式转换以转换为 Client.Model.City 和 Error 属性将消失:

ODataContainer container = new ODataContainer(new Uri("http://localhost:45666/odata"));
container.AddToCities((Client.Model.City)city);

注意:这种方法有其自身的缺点,因为它可能会导致您在不同的命名空间下使用相同的类名,因此在使用相同的类名时您通常必须使用完整的命名空间路径。您可以避免在 UI 模型上使用带有类名的不同前缀/后缀。例如CityViewModel

关于c# - .Net OData v4 客户端生成 - IDataErrorInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31483455/

相关文章:

c# - 无法从搜索页面删除记录

c# - 无法使用 prnmngr.vbs 在远程计算机上设置默认打印机

odata - 如何在 UseMvc 中间件之外的 .NetCore 3.1 中注册 OData 扩展方法

c# - 有没有一种简单的方法可以在 C# 中使用内存存储来支持 OData 搜索?

c# - Angular/Web API 2 使用 StreamContent 或 ByteArrayContent 返回无效或损坏的文件

c# - Web Api 2 - 自定义数据类型 JSON 序列化

c# - 抽象方法与接口(interface)

c# - 如何使用 OleDbConnection 从 Excel 文件检索数据

rest - 使用 OData 异步创建资源

asp.net-web-api2 - 找不到 ASP.NET web api 2 EnableCors 方法