使用 Web API 和 RavenDB 进行继承的自定义模型绑定器

2024-01-08

我正在开发一个简单的网络应用程序,我需要绑定特定类型的所有类型实现和接口。我的界面有一个像这样的属性

public interface IContent {
    string Id { get;set; }
}

使用此接口的常见类如下所示

public class Article : IContent {
    public string Id { get;set; }
    public string Heading { get;set; }
}

在这里要清楚的是,文章类只是实现 IContent 的许多不同类之一,因此我需要一种存储和更新这些类型的通用方法。

所以在我的控制器中我有这样的 put 方法

public void Put(string id, [System.Web.Http.ModelBinding.ModelBinder(typeof(ContentModelBinder))] IContent value)
{
    // Store the updated object in ravendb
}

和 ContentBinder

public class ContentModelBinder : System.Web.Http.ModelBinding.IModelBinder {
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) {

        actionContext.ControllerContext.Request.Content.ReadAsAsync<Article>().ContinueWith(task =>
        {
            Article model = task.Result;
            bindingContext.Model = model;
        });

        return true; 
    }

}

上面的代码不起作用,因为即使我使用默认模型绑定器,它似乎也无法正确绑定标题,但它似乎无法获取标题属性。

那么,在 BindModel 方法中,我想我需要根据 Id 从 ravendb 加载正确的对象,然后使用某种默认模型绑定器等更新复杂对象?这是我需要帮助的地方。


Marcus,下面是一个对于 Json 和 Xml 格式化程序都适用的示例。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Net.Http.Headers;
using System.Runtime.Serialization;
using System.Web.Http;
using System.Web.Http.SelfHost;

namespace Service
{
    class Service
    {
        private static HttpSelfHostServer server = null;
        private static string baseAddress = string.Format("http://{0}:9095/", Environment.MachineName);

        static void Main(string[] args)
        {
            HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(baseAddress);
            config.Routes.MapHttpRoute("Default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
            config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;

            try
            {
                server = new HttpSelfHostServer(config);
                server.OpenAsync().Wait();

                Console.WriteLine("Service listenting at: {0} ...", baseAddress);

                TestWithHttpClient("application/xml");

                TestWithHttpClient("application/json");

                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception Details:\n{0}", ex.ToString());
            }
            finally
            {
                if (server != null)
                {
                    server.CloseAsync().Wait();
                }
            }
        }

        private static void TestWithHttpClient(string mediaType)
        {
            HttpClient client = new HttpClient();

            MediaTypeFormatter formatter = null;

            // NOTE: following any settings on the following formatters should match
            // to the settings that the service's formatters have.
            if (mediaType == "application/xml")
            {
                formatter = new XmlMediaTypeFormatter();
            }
            else if (mediaType == "application/json")
            {
                JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
                jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;

                formatter = jsonFormatter;
            }

            HttpRequestMessage request = new HttpRequestMessage();
            request.RequestUri = new Uri(baseAddress + "api/students");
            request.Method = HttpMethod.Get;
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mediaType));
            HttpResponseMessage response = client.SendAsync(request).Result;
            Student std = response.Content.ReadAsAsync<Student>().Result;

            Console.WriteLine("GET data in '{0}' format", mediaType);
            if (StudentsController.CONSTANT_STUDENT.Equals(std))
            {
                Console.WriteLine("both are equal");
            }

            client = new HttpClient();
            request = new HttpRequestMessage();
            request.RequestUri = new Uri(baseAddress + "api/students");
            request.Method = HttpMethod.Post;
            request.Content = new ObjectContent<Person>(StudentsController.CONSTANT_STUDENT, formatter);
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(mediaType));
            Student std1 = client.SendAsync(request).Result.Content.ReadAsAsync<Student>().Result;

            Console.WriteLine("POST and receive data in '{0}' format", mediaType);
            if (StudentsController.CONSTANT_STUDENT.Equals(std1))
            {
                Console.WriteLine("both are equal");
            }
        }
    }

    public class StudentsController : ApiController
    {
        public static readonly Student CONSTANT_STUDENT = new Student() { Id = 1, Name = "John", EnrolledCourses = new List<string>() { "maths", "physics" } };

        public Person Get()
        {
            return CONSTANT_STUDENT;
        }

        // NOTE: specifying FromBody here is not required. By default complextypes are bound
        // by formatters which read the body
        public Person Post([FromBody] Person person)
        {
            if (!ModelState.IsValid)
            {
                throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, this.ModelState));
            }

            return person;
        }
    }

    [DataContract]
    [KnownType(typeof(Student))]
    public abstract class Person : IEquatable<Person>
    {
        [DataMember]
        public int Id { get; set; }

        [DataMember]
        public string Name { get; set; }

        // this is ignored
        public DateTime DateOfBirth { get; set; }

        public bool Equals(Person other)
        {
            if (other == null)
                return false;

            if (ReferenceEquals(this, other))
                return true;

            if (this.Id != other.Id)
                return false;

            if (this.Name != other.Name)
                return false;

            return true;
        }
    }

    [DataContract]
    public class Student : Person, IEquatable<Student>
    {
        [DataMember]
        public List<string> EnrolledCourses { get; set; }

        public bool Equals(Student other)
        {
            if (!base.Equals(other))
            {
                return false;
            }

            if (this.EnrolledCourses == null && other.EnrolledCourses == null)
            {
                return true;
            }

            if ((this.EnrolledCourses == null && other.EnrolledCourses != null) ||
                (this.EnrolledCourses != null && other.EnrolledCourses == null))
                return false;

            if (this.EnrolledCourses.Count != other.EnrolledCourses.Count)
                return false;

            for (int i = 0; i < this.EnrolledCourses.Count; i++)
            {
                if (this.EnrolledCourses[i] != other.EnrolledCourses[i])
                    return false;
            }

            return true;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Web API 和 RavenDB 进行继承的自定义模型绑定器 的相关文章

  • 具有 MVC4 风格捆绑的 Intellisense

    到目前为止我找不到问题或解决这个问题 我确信我错过了一些简单的事情 我有一个带有一堆缩小的 CSS 的样式包 并且我正在用里面的类来装饰 HTML 元素 一切都运转良好 然而 Intellisense 和 ReSharper 都因为 CSS
  • 如何为 asp.net MVC 5 配置 StructureMap

    我遇到以下错误 我的设置与 asp net mvc 4 类似 没有为此对象定义无参数构造函数 描述 安 当前网页执行期间发生未处理的异常 要求 请查看堆栈跟踪以获取有关的更多信息 错误及其在代码中的起源 异常详细信息 System Miss
  • 如何在 asp.net mvc 4 中使用 signalr v2 beta

    v2 之前 RouteTable Routes MapHubs 在 v2 中 MapHubs 不再存在 wiki 说添加一个 Startup 类和一个 Configuration 方法以及对 app MapHubs 的调用 namespac
  • ASP.Net Web API:在读取/上传请求正文之前发送响应

    我的控制器上有一个操作 应该上传大型 500mb 2gb 文件 例如 HttpPost public void PostFile FromUri Guid uploadId 在正文内部 执行一些检查 例如 uploadId 是否存在 然后将
  • 将数组从 javascript 传递到控制器 MVC 4

    我正在使用剃刀 但很难将数组传递给控制器 该数组包含我制作的对象 我正在尝试执行此操作 ajax type POST url HomePage HandleOperations data JSON stringify operationCo
  • 为什么 RestSharp 反序列化两个日期的方式不同?

    我有一个返回此值的休息调用 使用 Chrome 中的 Advance Rest Client 进行测试 MyObject 22 0 ID 123456 UTC1 2013 04 19T03 12 32Z UTC2 2013 04 19T03
  • Angular 6 Asp.Net(非 Core)Web Api CORS 请求失败

    我正在构建一个 Net Web Api 它将由 Angular 6 客户端使用 但出于某种原因 我无法使其在我的开发环境中工作 我从一个非常简单的 Web Api 开始 它只返回一个字符串 用于前端和后端测试目的之间的通信 GET api
  • 根据 MVC 中的文化的日期时间格式

    我有一个 MVC 视图 其中列出了一个名为 CreatedOn 的日期时间类型列 值的格式如下 日 月 年 时 分 秒 当我单击编辑链接修改值时 我获得相同的格式 当我修改编辑值时 出现验证错误 字段 CreatedOn 必须是日期 我的
  • 如何在c#中使用文件上传控件调整大小并保存上传的图像

    我使用 ASP NET MVC4 和 razor 开发了一个 Web 应用程序 在我的应用程序中 有一个文件上传控件可以上传图像并保存在临时位置 在保存图像之前 应将图像调整为特定大小 然后保存在给定的临时位置 这是我在控制器类中使用的代码
  • 创建包罗万象的路由

    我在网上找到了几个在 ASP NET MVC 中创建包罗万象的路由的示例 尤其是在 StackOverflow 上 但这似乎在 MVC4 中对我不起作用 public static void RegisterRoutes RouteColl
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • ASP.NET MVC 粘贴到剪贴板

    我有一个 ASP NET MVC 4 应用程序 我想复制文本 从 PDF CTRL C 并将其作为参数粘贴到控制器的方法中 我的网络网格有一个带有 ActionLink 的列 grid Column format a href Url Ac
  • 为什么 CastleWindsor 的 BeginScope 超出范围?

    我正在尝试将温莎城堡添加到我的 Web API 项目中 并且正在关注这个帖子 http blog kerbyyoung com 2013 01 setting up castle windsor for aspnet html commen
  • ASP.NET Web API 错误:未找到与请求 URI 匹配的 HTTP 资源

    我正在尝试将 Web API 添加到现有的 ASP NET MVC 项目中 这最初是一个 ASP NET MVC 2 网站 后来使用以下过程升级到 MVC 3 然后再次升级到 MVC 4 将 ASP NET MVC 2 项目升级到 ASP
  • Api 控制器中长时间运行的任务(使用 Web API,自托管 OWIN)

    我想在自托管 OWIN 环境中的 ApiController 中运行长时间运行的任务 例如 4 5 分钟 但是 我想在开始该任务后 一旦开始长时间运行的任务 就发回响应 而不等待它完成 这个长时间运行的任务与 HTTP 无关 并且顺序运行一
  • 在操作之外执行异步操作 asp.net mvc

    我希望能够在每个请求上从云数据库加载用户 并使用 asp net mvc 在控制器中的请求上提供该用户 问题是当前框架不支持从操作过滤器执行异步操作 所以 OnActionExecuting OnAuthorization 方法不允许我这样
  • 如何处理 ASP.net MVC Ajax 加载页面上的 jQuery 事件?

    我有一个问题 我是 jQuery Mobile 领域的新手 对于 ASP Net MVC 部分我有点迷失 这是我的问题 在我的移动网站中 我想更改导航栏 我使用的更像是应用程序栏 按钮 而我位于编辑页面或主页等 因此 这些页面 编辑 显示
  • .Net Web API 未找到与请求 URI 匹配的 HTTP 资源

    我正在开发 Net Web API 它在调试和本地主机 IIS 上都运行良好 但是当我将其发布到服务器时 它开始给出以下错误 Message 未找到与请求 URI 匹配的 HTTP 资源 在服务器上 我们在该 API 的默认站点下有应用程序
  • OWIN OnSendingHeaders 回调 - 读取响应正文

    这个问题与优秀有关answer https stackoverflow com a 17513249 1709870由优素福 我爱OnSendingHeaders打回来 我现在可以添加响应标头 而不必担心切换流 无论如何 这是我的问题 是否
  • WebApi 自定义 JsonConverter 未调用

    我为 Guid 实现了一个自定义 JsonConverter 如果我在像这样序列化的类的属性 Guid 类型 上声明它 JsonConverter typeof JsonGuidConverter 然后它被调用并且工作正常 但是 我想 自动

随机推荐

  • Django:标记为已读“通知”

    我正在做一个学校项目 现在任何用户都可以提出问题 为了在任何用户提出问题时通知所有用户 我创建了一个新应用程序 并在提出问题时通过简单的 视图 通知他们 但这还只是普通的通知 用户打开 通知 选项卡后 如何将它们标记为已读 就像在社交网络上
  • 如何从浏览器读取客户端的机器/计算机名称?

    如何从浏览器读取客户端的机器 计算机名称 是否可以使用 JavaScript 和 或 ASP NET 您 有时 可以使用 IE 来完成此操作 因为我已经在只有 IE 的 Intranet 上的内部应用程序中完成了此操作 请尝试以下操作 fu
  • 按字符串选择列时,Dplyr 的 tbl_df 会出现意外行为

    通常 当以编程方式使用 dplyr 时 我希望通过名称选择列 其中列名称作为字符串存储在某个变量中 我注意到尝试使用 dplyr 执行此操作通常会导致意外结果 这似乎是由于 tbl df 的处理方式造成的 以下是一些示例 regular d
  • 如何将一个函数作为参数传递给另一个函数

    我想将一个函数作为参数传递给另一个函数 例如 void myFunction boolean coondition void function if condition function 在 Java 8 中这可能吗 不 你不能传递方法 但
  • 从c# 连接到oracle

    我正在尝试从 C 连接 Oracle 11g 我已关注 此链接 定义了连接别名 如下所示 moviess DESCRIPTION ADDRESS PROTOCOL TCP HOST localhost PORT 1521 CONNECT D
  • Entity Framework 4.1 Fluent API 中具有联接表和可选关系的一对多

    再次使用无法更改的旧数据库 并使用 Entity Framework 4 1 和 Fluent API 仅读取数据 public class Client Key public int ClientID get set public str
  • 如何 Dockerize Windows 应用程序

    我有一个 Windows 应用程序 我想将其容器化 它是一个 Windows 桌面应用程序 不是 Web 应用程序 我做了一些搜索 发现关于容器化桌面应用程序的信息很少 我想要容器化的应用程序在 WindowsServerCore 上运行良
  • Angular4 更改 md 按钮的波纹颜色

    我使用 Material for Angular4 在网页中创建了一个 md 按钮 有没有办法改变波纹效果的颜色并使其变为白色 我还可以更改其他波纹属性 例如波纹效果的持续时间吗 事实证明 为了更改波纹属性 应该在 mat ripple t
  • BehaviourSubject 初始值不适用于 share()

    share 运算符应用于BehaviorSubject BehaviourSubject 有初始值 目标是创建单个共享订阅 但是当BehaviorSubject有初始值时 这种共享订阅似乎不起作用 得到意想不到的结果 代码如下所示 let
  • 使用我自己的实体而不是 POCO 实体

    我正在使用实体框架 我可以使用自己的实体来代替 POCO 实体吗 我可以使用任何实体 或者实体名称和成员有任何限制吗 如果实体的成员与字段的名称不同 如何在 db 字段与实体的成员本身之间映射 UPDATE我已经拥有数据库广告一个大型项目
  • 将函数放入对象中与对其进行原型设计之间有什么区别?

    向对象添加函数和将函数原型化到对象上有什么区别 原型设计允许对象 模型调用自身吗 函数对象 通常用于对一组函数进行 命名空间 以便一个容器对象具有许多方法而不是许多全局函数 这样做的好处是保持代码组件按对象 可能还有对象层次结构 进行分类或
  • 三个值的中值

    我正在尝试编写一个 C 程序 它接受 3 个值作为函数参数并返回中位数 该程序运行得很好 直到我意识到它不能使用相同的值两次或更多次 例如 如果输入是 1 2 3 我得到 2 正确的中位数 但如果输入是 1 2 1 或 1 1 1 循环从头
  • 如何将列表转换为以索引作为值的字典?

    我正在尝试转换以下列表 l A B C 对于像这样的字典 d A 0 B 1 C 2 我尝试过其他帖子的答案 但没有一个对我有用 我现在有以下代码 d l i i for i in range len l 这给了我这个错误 unhashab
  • 检查类型是否可为 Null 的正确方法[重复]

    这个问题在这里已经有答案了 为了检查是否Type propertyType 可以为空 我正在使用 bool isNullable Nullable 1 Equals propertyType Name 有什么方法可以避免使用魔术字符串吗 绝
  • 当我的 JAR 位于类路径中时,为什么 Ant 会说“NoClassDefFound”?

    我正在使用 Java 1 6 Eclipse 和 Ant 以下是我创建 jar 文件并运行它的目标
  • 使用 scrapy 与 javascript __doPostBack 方法时出现问题

    尝试自动从公共搜索中抓取搜索结果 但遇到了一些麻烦 URL 的形式为 http www website com search aspx keyword page 1 sort Sorting 当我点击页面时 访问此页面后 它会略有变化 ht
  • 角度4,如何传递提供者实例

    我有一个 Mqtt 服务 我可以从中获取一些实时数据 几何和温度 Mqtt 服务 import Injectable from angular core import Paho from Own paho sript geomqttws31
  • 两个独立数据帧的距离矩阵

    我想创建一个矩阵 其中包含一个数据帧的行与另一个数据帧的行的欧几里德距离 例如 假设我有以下数据框 a lt c 1 2 3 4 5 b lt c 5 4 3 2 1 c lt c 5 4 1 2 3 df1 lt data frame a
  • Webdriver 支持 Python 的 pagefactory 吗?

    我正在读关于页面对象 http code google com p selenium wiki PageObjects和 Webdriver 项目网站上的设计模式 并遇到了页面工厂 http code google com p seleni
  • 使用 Web API 和 RavenDB 进行继承的自定义模型绑定器

    我正在开发一个简单的网络应用程序 我需要绑定特定类型的所有类型实现和接口 我的界面有一个像这样的属性 public interface IContent string Id get set 使用此接口的常见类如下所示 public clas