天道酬勤,学无止境

如何在ASP.NET MVC中测试自定义模型绑定器?(How to test custom Model Binders in ASP.NET MVC?)

问题

我在ASP.NET MVC应用程序中编写了一些自定义模型绑定程序(实现IModelBinder)。 我想知道什么是对它们(粘合剂)进行单元测试的好方法?

回答1

我这样做是这样的:

var formElements = new NameValueCollection() { {"FirstName","Bubba"}, {"MiddleName", ""}, {"LastName", "Gump"} };         
var fakeController = GetControllerContext(formElements);
var valueProvider = new Mock<IValueProvider>();           

var bindingContext = new ModelBindingContext(fakeController, valueProvider.Object, typeof(Guid), null, null, null, null);



private static ControllerContext GetControllerContext(NameValueCollection form) {
    Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
    mockRequest.Expect(r => r.Form).Returns(form);

    Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
    mockHttpContext.Expect(c => c.Request).Returns(mockRequest.Object);

    return new ControllerContext(mockHttpContext.Object, new RouteData(), new Mock<ControllerBase>().Object);
}

然后,我只是将bindingContext变量传递给实现IModelBinder接口的对象的BindModel方法。

回答2

假设您使用ValueProvider而不是HttpContext,这是我在博客上为您写的一种简单的简单方法:http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx

[TestMethod]  
public void DateTime_Can_Be_Pulled_Via_Provided_Month_Day_Year_Hour_Minute_Second_Alternate_Names()  
{  
    var dict = new ValueProviderDictionary(null) {   
            { "foo.month1", new ValueProviderResult("2","2",null) },  
            { "foo.day1", new ValueProviderResult("12", "12", null) },  
            { "foo.year1", new ValueProviderResult("1964", "1964", null) },  
            { "foo.hour1", new ValueProviderResult("13","13",null) },  
            { "foo.minute1", new ValueProviderResult("44", "44", null) },  
            { "foo.second1", new ValueProviderResult("01", "01", null) }  
        };  

    var bindingContext = new ModelBindingContext() { ModelName = "foo", ValueProvider = dict };  

    DateAndTimeModelBinder b = new DateAndTimeModelBinder() { Month = "month1", Day = "day1", Year = "year1", Hour = "hour1", Minute = "minute1", Second = "second1" };  

    DateTime result = (DateTime)b.BindModel(null, bindingContext);  
    Assert.AreEqual(DateTime.Parse("1964-02-12 13:44:01"), result);  
}  
回答3

dict可以像这样重构

            FormCollection form = new FormCollection
                                  {
                                      { "month1", "2" },
                                      { "day1", "12" },
                                      { "year1", "1964" },
                                      { "hour1", "13" },
                                      { "minute1", "44" },
                                      { "second1", "01" }
                                  };

            var bindingContext = new ModelBindingContext() { ModelName = "foo", ValueProvider = form.ToValueProvider() };  

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在ASP.NET MVC 2+中将DI / IoC容器与模型绑定程序一起使用?(How to use a DI / IoC container with the model binder in ASP.NET MVC 2+?)
    问题 假设我有一个User实体,我想将其在构造函​​数中的CreationTime属性设置为DateTime.Now。 但是作为单元测试采用者,我不想直接访问DateTime.Now,而是使用ITimeProvider: public class User { public User(ITimeProvider timeProvider) { // ... this.CreationTime = timeProvider.Now; } // ..... } public interface ITimeProvider { public DateTime Now { get; } } public class TimeProvider : ITimeProvider { public DateTime Now { get { return DateTime.Now; } } } 我在ASP.NET MVC 2.0应用程序中使用NInject 2。 我有一个UserController和两个Create方法(一个用于GET和一个用于POST)。 一个用于GET的方法是直接的,但是一个用于POST的方法则不是那么简单也不是那么好:P,因为我需要弄乱模型绑定器以告诉它获取ITimeProvider实现的引用,以便能够构造用户实例。 public class UserController
  • 属性的自定义模型活页夹(Custom model binder for a property)
    问题 我有以下控制器操作: [HttpPost] public ViewResult DoSomething(MyModel model) { // do something return View(); } MyModel如下所示: public class MyModel { public string PropertyA {get; set;} public IList<int> PropertyB {get; set;} } 因此,DefaultModelBinder应该可以毫无问题地绑定此对象。 唯一的事情是我想使用特殊/自定义的绑定器来绑定PropertyB而且我也想重用此绑定器。 因此,我认为解决方案是将ModelBinder属性放在PropertyB之前,这当然是行不通的(属性上不允许使用ModelBinder属性)。 我看到两个解决方案: 要在每个单个属性而不是整个模型上使用动作参数(我不希望这样做,因为该模型具有很多属性),如下所示: public ViewResult DoSomething(string propertyA, [ModelBinder(typeof(MyModelBinder))] propertyB) 若要创建新类型,请说MyCustomType: List<int>并为此类型注册模型绑定程序(这是一个选项)
  • 《ASP.NET MVC 5 编程实战》 - 学习笔记
    《ASP.NET MVC 5 编程实战》 ========== ========== ========== [作者] (美) Dino Esposito [译者] (中) 潘丽臣 [出版] 清华大学出版社 [版次] 2015年03月 第1版 [印次] 2015年03月 第1次 印刷 [定价] 59.80元 ========== ========== ========== 【前言】 Web Forms 的最常见应用场景是,你要开发专注于呈现数据并使用第三方控件套装的应用程序。 ASP.NET MVC 可用于处理其他所有方面,包括客户端单页面应用程序的框架搭建。 ASP.NET MVC 足以成为任何一个需要实体后台的应用程序的理想 Web 平台,对于那些以多设备实用功能为目标的 Web 应用程序来说尤其如此。 【第01章】 (P003) 在 ASP.NET MVC 中,每个请求的结果最终都会执行某个操作 —— 根本上来说也就是特定类上的方法。操作执行的结果会与一个视图模板一起传递给视图子系统。结果和模板随后会用于生成浏览器的最终响应。用户不需要将浏览器指向某个页面,他们只需要放置一个请求即可。 使用 ASP.NET MVC ,可以获得对标记的完全控制,并能随意用你最喜欢的 JavaScript 框架来套用样式和注入脚本代码。 (P004) 在软件中,术语 URI (统一资源标识符)
  • 《ASP.NET MVC 5 编程实战》 - 学习笔记
    《ASP.NET MVC 5 编程实战》 ========== ========== ==========[作者] (美) Dino Esposito[译者] (中) 潘丽臣[出版] 清华大学出版社[版次] 2015年03月 第1版[印次] 2015年03月 第1次 印刷[定价] 59.80元========== ========== ========== 【前言】 Web Forms 的最常见应用场景是,你要开发专注于呈现数据并使用第三方控件套装的应用程序。 ASP.NET MVC 可用于处理其他所有方面,包括客户端单页面应用程序的框架搭建。 ASP.NET MVC 足以成为任何一个需要实体后台的应用程序的理想 Web 平台,对于那些以多设备实用功能为目标的 Web 应用程序来说尤其如此。 【第01章】 (P003) 在 ASP.NET MVC 中,每个请求的结果最终都会执行某个操作 —— 根本上来说也就是特定类上的方法。操作执行的结果会与一个视图模板一起传递给视图子系统。结果和模板随后会用于生成浏览器的最终响应。用户不需要将浏览器指向某个页面,他们只需要放置一个请求即可。 使用 ASP.NET MVC ,可以获得对标记的完全控制,并能随意用你最喜欢的 JavaScript 框架来套用样式和注入脚本代码。 (P004) 在软件中,术语 URI (统一资源标识符)
  • 数据输入后修剪字符串的最佳方法。 我应该创建自定义模型活页夹吗?(Best way to trim strings after data entry. Should I create a custom model binder?)
    问题 我正在使用ASP.NET MVC,我希望在将所有用户输入的字符串字段插入数据库之前先对其进行修剪。 并且由于我有许多数据输入表单,因此我正在寻找一种修整所有字符串的方法,而不是显式修整每个用户提供的字符串值。 我很想知道人们如何以及何时修剪琴弦。 我考虑过可能要创建一个自定义模型联编程序并在那里修剪任何字符串值...那样,我所有的修剪逻辑都包含在一个地方。 这是一个好方法吗? 是否有任何代码示例可以做到这一点? 回答1 public class TrimModelBinder : DefaultModelBinder { protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value) { if (propertyDescriptor.PropertyType == typeof(string)) { var stringValue = (string)value; if (!string.IsNullOrWhiteSpace(stringValue)) { value =
  • 在ASP.NET MVC中将自定义编辑器模板与IEnumerable模型一起使用的正确,惯用方式(Correct, idiomatic way to use custom editor templates with IEnumerable models in ASP.NET MVC)
    问题 此问题是有关为什么我的DisplayFor不循环通过IEnumerable <DateTime>的后续问题? 快速刷新。 什么时候: 该模型具有IEnumerable<T>类型的属性您可以使用仅接受lambda表达式的重载将此属性传递给Html.EditorFor() 您在Views / Shared / EditorTemplates下具有类型T的编辑器模板 然后MVC引擎将自动以可枚举的顺序为每个项目调用编辑器模板,并生成结果列表。 例如,当存在带有属性Lines的模型类Order时: public class Order { public IEnumerable<OrderLine> Lines { get; set; } } public class OrderLine { public string Prop1 { get; set; } public int Prop2 { get; set; } } 并且有一个视图Views / Shared / EditorTemplates / OrderLine.cshtml: @model TestEditorFor.Models.OrderLine @Html.EditorFor(m => m.Prop1) @Html.EditorFor(m => m.Prop2) 然后,当您从顶级视图调用@Html
  • 如何在JSON.NET中将其作为ASP.NET MVC控制器的模型绑定器?(How do I sub in JSON.NET as model binder for ASP.NET MVC controllers?)
    问题 ASP.NET Web API团队已决定将JSON.NET库用于模型绑定JSON数据。 但是,“常规” MVC控制器仍使用劣质的JsonDataContractSerializer。 这会导致解析日期出现问题,并让我头疼不已。 请参阅此作为参考: http://www.devcurry.com/2013/04/json-dates-are-different-in-aspnet-mvc.html 作者选择在客户端的Knockout层中解决此问题。 但是我更愿意通过在MVC控制器中使用与Web API控制器相同的JSON.NET模型绑定程序来解决此问题。 如何将不同的JSON模型绑定程序替换为ASP.NET MVC? 具体来说,就是JSON.NET库。 如果可能的话,使用来自Web API的相同模型绑定器将是理想的。 回答1 我已经做到了,并且还通过以下方式大量定制了Json.NET正在执行的序列化: 替换global.asax.cs中的默认格式化Application_Start , Application_Start : GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.JsonFormatter)
  • 为什么ASP.NET MVC默认的Model Binder速度慢? 需要很长时间才能完成工作(Why ASP.NET MVC default Model Binder is slow? It's taking a long time to do its work)
    问题 在当前项目中,客户要求以两种方式回答问卷的可能性:以一种形式使用Wizard (一次回答一个问题)和Listing (一次回答所有问题)。 两种方法都已实现。 根据手册的章节,使用AJAX从数据库中加载问题(这是非常快的)。 目前最大的一章有230问题(每个问题有4个HTML输入字段-输入/文本,选择等)。 如果用户选择此类章节以Listing格式回答,则<form>将包含大约920要发布到服务器的字段。 我正在做一个AJAX POST请求,使用jQuery的serialize方法传递数据: data: $("#questions :input").serialize() 该序列化需要207.143ms才能完成。 我在Firefox中使用Firebug调试了此值: console.profile(); $("#questions :input").serialize(); console.profileEnd(); 再次,这是超级快... 在通过以下操作方法对收到的数据进行水合处理时,会出现问题: public async Task<ActionResult> ListSaveAsync(IEnumerable<AnswerViewModel> questions) 如您所见,发布的数据是绑定到IEnumerable<AnswerViewModel> questions数据。
  • Asp.net MVC中的自定义DateTime模型绑定程序(Custom DateTime model binder in Asp.net MVC)
    问题 我想为DateTime类型编写我自己的模型活页夹。 首先,我想编写一个可以附加到模型属性的新属性,例如: [DateTimeFormat("d.M.yyyy")] public DateTime Birth { get; set,} 这是简单的部分。 但是活页夹部分要困难一些。 我想为DateTime类型添加一个新的模型活页夹。 我可以 实现IModelBinder接口并编写我自己的BindModel()方法从DefaultModelBinder继承并重写BindModel()方法 我的模型具有上述属性( Birth )。 因此,当模型尝试将请求数据绑定到此属性时,将调用我的模型绑定器的BindModel(controllerContext, bindingContext) 。 一切正常,但是。 如何从controller / bindingContext获取属性属性,以正确解析我的日期? 如何到达属性Birth的PropertyDesciptor ? 编辑 由于关注点分离,我的模型类是在不(也不应该)引用System.Web.MVC程序集的程序集中定义的。 设置自定义绑定(类似于Scott Hanselman的示例)属性在这里是不行的。 回答1 我认为您不应该在模型上放置特定于语言环境的属性。 此问题的两个其他可能的解决方案是:
  • 我的自定义ASP.NET MVC实体绑定:这是一个好的解决方案吗?(My custom ASP.NET MVC entity binding: is it a good solution?)
    问题 假设我想允许在页面上(例如,从下拉列表等)选择我们的实体,例如产品。 结果,我可能会收到以下消息: public ActionResult SelectedAction(Guid productId) { } 但是,我想使用模型联编程序的功能,所以我改写了模型联编程序以从存储库中获取我的产品,而是使用 public ActionResult SelectedAction(Product product) { if (ModelState.IsValid) {} else {} } 如果产品无效,我的模型绑定器会将模型状态设置为false。 现在,这种方法存在问题: 使用Html.ActionLink(c => c.SelectedAction(id))之类的强类型方法并不总是那么容易,因为我们需要传递Product而不是id。 无论如何,使用实体作为控制器参数是不好的。 如果模型状态无效,并且我想重定向回并显示错误,则无法保存所选产品! 因为未设置绑定产品,并且我的ID不存在。 我想做RedirectToAction(c => c.Redisplay(product)),但是当然这是不可能的。 现在,好像我要使用“ Guid productId”作为参数了……但是,我想介绍和讨论一种解决方案。 public class EntityViewModel<T> where T
  • ASP.NET MVC模型与ViewModel(ASP.NET MVC Model vs ViewModel)
    问题 好的,我一直在听有关MS的ASP.NET MVC的有关“ ViewModels”的讨论。 现在,这打算成为一种特定的模型,对吗? 不是一种特定的视图。 据我了解,这是一种模型,其特定目的是与View进行交互? 或类似的东西? 一些澄清将不胜感激。 回答1 本质上,Model和View Model都是具有属性的简单类。 这些类的主要目的是为相应的观众(分别是控制器和视图)描述一个对象(“模型”)。 所以说的话你是完全正确的 据我了解,这是一种模型,其特定目的是与View进行交互 因此,虽然模型类实际上是您的应用程序与之交互的域实体,但是视图模型是您的视图与之交互的简单类。 希望能帮助到你 :) 更新: Microsoft已开发了Martin fowler的专用版本的Presentation Pattern,主要基于Model-View-Controller,并将其称为PF应用程序的Model-View-ViewModel(MVVM)。 此模式针对的是现代UI开发平台,在该平台上,UI开发人员比传统开发人员更多地基于业务逻辑来满足不同的需求。 在这里看看一些理论 回答2 用最简单的术语来说,我想以下几点: 模型:严格的外观和感觉就像您的数据模型。 出于所有目的和目的,它仅是数据模型的类表示。 它不了解您的视图或视图中的任何元素。 也就是说,它不应包含用于视图的任何属性修饰符(即
  • 通用类型的ASP.NET MVC模型绑定器(ASP.NET MVC Model Binder for Generic Type)
    问题 是否可以为泛型类型创建模型绑定程序? 例如,如果我有一个类型 public class MyType<T> 有什么方法可以创建适用于任何类型的MyType的自定义模型联编程序? 谢谢,内森 回答1 创建一个模型绑定器,重写BindModel,检查类型并执行所需的操作 public class MyModelBinder : DefaultModelBinder { public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (HasGenericTypeBase(bindingContext.ModelType, typeof(MyType<>)) { // do your thing } return base.BindModel(controllerContext, bindingContext); } } 将您的模型资料夹设置为global.asax中的默认值 protected void Application_Start() { // Model Binder for My Type ModelBinders.Binders.DefaultBinder = new MyModelBinder(); }
  • 复杂的对象和模型绑定器ASP.NET MVC(Complex object and model binder ASP.NET MVC)
    问题 我有一个带有Foo类的模型对象结构,该类包含一个带有字符串值的Bar 。 public class Foo { public Bar Bar; } public class Bar { public string Value { get; set; } } 还有一个使用这种结构的视图模型 public class HomeModel { public Foo Foo; } 然后,我有一个表格可以认为在Razor中看起来像这样。 <body> <div> @using (Html.BeginForm("Save", "Home", FormMethod.Post)) { <fieldset> @Html.TextBoxFor(m => m.Foo.Bar.Value) <input type="submit" value="Send"/> </fieldset> } </div> </body> 在html中成为。 <form action="/Home/Save" method="post"> <fieldset> <input id="Foo_Bar_Value" name="Foo.Bar.Value" type="text" value="Test"> <input type="submit" value="Send"> </fieldset> </form> 最终
  • 复杂的对象和模型绑定器ASP.NET MVC(Complex object and model binder ASP.NET MVC)
    问题 我有一个带有Foo类的模型对象结构,该类包含一个带有字符串值的Bar 。 public class Foo { public Bar Bar; } public class Bar { public string Value { get; set; } } 还有一个使用这种结构的视图模型 public class HomeModel { public Foo Foo; } 然后,我有一个表格可以认为在Razor中看起来像这样。 <body> <div> @using (Html.BeginForm("Save", "Home", FormMethod.Post)) { <fieldset> @Html.TextBoxFor(m => m.Foo.Bar.Value) <input type="submit" value="Send"/> </fieldset> } </div> </body> 在html中成为。 <form action="/Home/Save" method="post"> <fieldset> <input id="Foo_Bar_Value" name="Foo.Bar.Value" type="text" value="Test"> <input type="submit" value="Send"> </fieldset> </form> 最终
  • 如何使用自定义模型活页夹过滤表单数据(How to filter form data with custom model binder)
    问题 我有一堆输入货币值的表格,希望它们能够输入“ $ 1,234.56”。 默认情况下,模型联编程序不会将其解析为小数。 我想做的是创建一个继承自DefaultModelBinder的自定义模型活页夹,重写BindProperty方法,检查属性描述符类型是否为十进制,如果是,则从值中除去$和。 这是最好的方法吗? 代码: public class CustomModelBinder : DefaultModelBinder { protected override void BindProperty( ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor ) { if( propertyDescriptor.PropertyType == typeof( decimal ) || propertyDescriptor.PropertyType == typeof( decimal? ) ) { var newValue = Regex.Replace( bindingContext.ValueProvider[propertyDescriptor.Name]
  • Asp.Net MVC 2-将模型的属性绑定到其他命名值(Asp.Net MVC 2 - Bind a model's property to a different named value)
    问题 更新(2016年9月21日) -感谢Digbyswift指出此解决方案仍可在MVC5中使用。 更新(2012年4月30日) -注意人们在搜索等过程中遇到的问题-可以接受的答案不是我最终这样做的方式-但我将其保留,因为在某些情况下它可能会起作用。 我自己的答案包含了我使用的最终解决方案,该解决方案是可重用的,并且将适用于任何项目。 还确认它可以在MVC框架的v3和v4中使用。 我具有以下模型类型(已更改类的名称及其属性以保护其标识): public class MyExampleModel { public string[] LongPropertyName { get; set; } } 然后,此属性绑定到一堆(> 150)复选框,其中每个人的输入名称当然是LongPropertyName 。 表单使用HTTP GET提交到url,并说用户选择了其中三个复选框?LongPropertyName=a&LongPropertyName=b&LongPropertyName=c将具有查询字符串?LongPropertyName=a&LongPropertyName=b&LongPropertyName=c 那么,最大的问题是,如果我选中所有(或什至只是一半以上!)复选框,我将超过IIS上的请求过滤器强制执行的最大查询字符串长度! 我不想扩展它-所以我想要一种方法来减少此查询字符串
  • 《ASP.NET Core 开发实战》 - 学习笔记
    《ASP.NET Core 开发实战》 ========== ========== ========== [作者] (意) Dino Esposito [译者] (中) 赵利通 [出版] 清华大学出版社 [版次] 2019年07月 第1版 [印次] 2019年12月 第2次 印刷 [定价] 79.80元 ========== ========== ========== 【前言】 (PVI) ASP.NET Core 是 ASP.NET 开发人员需要了解的一种技术,是在多种平台上进行 Web 开发时可供使用的另一种全栈解决方案。 【第01章】 (P006) 对于处理必须返回 HTML 内容的 Web 请求, ASP.NET MVC 编程模型是最灵活、最容易理解的方式。 (P008) .NET Core Framework 主要被设计为用于 ASP.NET 应用程序。 .NET Core Framework 只能用来编写 ASP.NET 和控制台应用程序。 .NET Core Framework 可与应用程序一同部署,而完整的 .NET Framework 只能安装到目标机器上,由所有应用程序共享。 (P009) .NET Core Framework 是从头开始重新设计的一个新框架,看上去与完整的 .NET Framework 很类似,但是能够跨平台工作。 (P010) ASP
  • 如何在MVC5项目中将Json.NET用于JSON模型绑定?(How to use Json.NET for JSON modelbinding in an MVC5 project?)
    问题 我一直在互联网上寻找答案或示例,但找不到。 我只是想更改默认的JSON序列化程序,该序列化程序用于在模型绑定到JSON.NET库时反序列化JSON。 我已经找到了这篇SO帖子,但是到目前为止还无法实现,我什至看不到System.Net.Http.Formatters命名空间,也看不到GlobalConfiguration 。 我想念什么? 更新 我有一个ASP.NET MVC项目,它基本上是一个MVC3项目。 目前,我的目标是.NET 4.5,并使用ASP.NET MVC 5和相关的NuGet程序包。 我没有看到System.Web.Http程序集,也没有看到任何类似的名称空间。 在这种情况下,我想注入JSON.NET用作JSON类型的请求的默认模型绑定器。 回答1 我终于找到了答案。 基本上,我不需要MediaTypeFormatter东西,不是设计用于MVC环境,而是在ASP.NET Web API中,这就是为什么我看不到那些引用和名称空间(顺便说一下,这些都包含在Microsoft.AspNet.WeApi NuGet包)。 解决方案是使用自定义值提供程序工厂。 这是所需的代码。 public class JsonNetValueProviderFactory : ValueProviderFactory { public override IValueProvider
  • ASP.NET Web API-ModelBinders(ASP.NET Web API - ModelBinders)
    问题 我需要使用某种自定义Modelbinder来始终以UK格式处理传入的日期,我已经设置了一个自定义模型活页夹并进行了如下注册: GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new DateTimeModelBinder()); 这似乎仅对querystring参数有效,并且仅当我在参数上这样指定[ModelBinder]时才有效,有没有办法让所有操作都使用模型绑定器: public IList<LeadsLeadRowViewModel> Get([ModelBinder]LeadsIndexViewModel inputModel) 另外,如何将发布的表单发送到Api控制器以使用模型资料夹? 回答1 我认为您不需要模型联编程序。 您的方法不正确。 正确的日期方法是使用客户端全球化库(例如globalize库)来解析以任何语言格式化的日期,并将其转换为JavaScript日期对象。 然后,您可以使用浏览器JSON.stringify在JSON中序列化数据脚本数据结构,这应该可以工作。 最好对日期始终使用标准格式,并使用格式器而不是模型绑定器。 如果使用C#DateTime对象的kind参数指定日期时间是以本地时间还是UTC时间表示,则可用的格式器也可以正确处理TimeZones。 回答2
  • 如何将JSON POST数据作为对象传递给Web API方法?(How to pass json POST data to Web API method as an object?)
    问题 ASP.NET MVC4 Web API应用程序定义了保存客户的发布方法。 客户在POST请求正文中以json格式传递。 post方法中的Customer参数包含属性的空值。 如何解决此问题,以便过帐的数据将作为客户对象传递? 如果可能的话,应该使用Content-Type:application / x-www-form-urlencoded,因为我不知道如何在发布表单的javascript方法中更改它。 控制器: public class CustomersController : ApiController { public object Post([FromBody] Customer customer) { return Request.CreateResponse(HttpStatusCode.OK, new { customer = customer }); } } } public class Customer { public string company_name { get; set; } public string contact_name { get; set; } } 要求: POST http://localhost:52216/api/customers HTTP/1.1 Accept: application/json, text