C# NancyFx将模型绑定到动态类型?
在Nancy中,是否有方法将POST请求的内容绑定到动态类型 例如:C# NancyFx将模型绑定到动态类型?,c#,.net,model-binding,nancy,C#,.net,Model Binding,Nancy,在Nancy中,是否有方法将POST请求的内容绑定到动态类型 例如: // sample POST data: { "Name": "TestName", "Value": "TestValue" } // model class public class MyClass { public string Name { get; set; } public string Value { get; set; } } // NancyFx POST url Post["/apiur
// sample POST data: { "Name": "TestName", "Value": "TestValue" }
// model class
public class MyClass {
public string Name { get; set; }
public string Value { get; set; }
}
// NancyFx POST url
Post["/apiurl"] = p => {
// this binding works just fine
var stronglyTypedModel = this.Bind<MyClass>();
// the following bindings do not work
// there are no 'Name' or 'Value' properties on the resulting object
dynamic dynamicModel1 = this.Bind();
var dynamicModel2 = this.Bind<dynamic>();
ExpandoObject dynamicModel3 = this.Bind();
var dynamicModel4 = this.Bind<ExpandoObject>();
}
//示例POST数据:{“Name”:“TestName”,“Value”:“TestValue”}
//模范班
公共类MyClass{
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
//NancyFx POST url
Post[“/apirl”]=p=>{
//这个装订很好用
var stronglyTypedModel=this.Bind();
//以下绑定不起作用
//结果对象上没有“名称”或“值”属性
dynamicModel1=this.Bind();
var dynamicModel2=this.Bind();
ExpandoObject dynamicModel3=this.Bind();
var dynamicModel4=this.Bind();
}
我不确定,但您可以试试:
dynamic model = new ExpandoObject();
model = Request; //or Request.Form
return View["ViewName", model];
如果有效,请告诉我:)开箱即用Nancy不支持动态模型绑定。代码迷已经写了一个快速的模型绑定器来实现这个目标 那么你可以这样使用它
dynamic model=this.Bind()代码>正如前面的答案所指出的,不支持直接绑定到动态类型,最类似的是由CodeJunkie在中提供的ModelBinder
但是,这种方法有一个问题,就是由这段代码生成的DynamicDictionary在以后没有正确序列化,只生成字典的键并丢失值。这里描述了这一点,到今天(版本1.4.3)仍在发生,严重限制了这种方法
解决方案是使用一个简单的技巧,访问POST中接收的原始数据并使用JSON.Net进行反序列化。在您的示例中,它将是:
using System;
using System.Dynamic;
using Nancy;
using Nancy.Extensions;
using Newtonsoft.Json;
Post["/apiurl"] = p => {
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(Request.Body.AsString());
//Now you can access the object using its properties
return Response.AsJson((object)new { a = obj.Prop1 });
}
使用系统;
运用系统动力学;
使用Nancy;
使用Nancy.Extensions;
使用Newtonsoft.Json;
Post[“/apirl”]=p=>{
dynamic obj=JsonConvert.DeserializeObject(Request.Body.AsString());
//现在,您可以使用对象的属性访问该对象
返回Response.AsJson((object)new{a=obj.Prop1});
}
请注意,您需要对Request.Body.AsString()调用使用Nancy.Extensions。我正在寻找一种将我的帖子正文反序列化为动态的方法,并发现了这个问题,我将使用Newtonsoft和extension方法提出我的解决方案,以防该结果对其他人有用
扩展方法
using System.IO;
using Nancy;
using Newtonsoft.Json;
namespace NancyFx
{
public static class DynamicModelBinder
{
public static dynamic ToDynamic(this NancyContext context)
{
var serializer = new JsonSerializer();
using (var sr = new StreamReader(context.Request.Body))
{
using (var jsonTextReader = new JsonTextReader(sr))
{
return serializer.Deserialize(jsonTextReader);
}
}
}
}
}
用法
using Nancy;
using Nancy.ModelBinding;
namespace NancyFx
{
public class HomeModule : NancyModule
{
public HomeModule(IAppConfiguration appConfig)
{
Post("/product", args => {
dynamic product = Context.ToDynamic();
string name = product.Name;
decimal price = product.Price;
return Response.AsJson(new {IsValid=true, Message= "Product added sucessfully", Data = new {name, price} });
});
}
}
}
你就不能发布[“/apirl”]=p=>{dynamic model=p;string name=model.name;string val=model.Value;}?@Alexander,请发布你的评论作为答复,以便在到期时获得代表:)谢谢你的回复Alexanderp'已经是一个动态类型,但我无法访问请求正文中的数据,因为它需要先进行反序列化。如果它是一个查询字符串或路由参数,我可以从'p'访问它,但在这种情况下,我需要从请求体反序列化JSON数据。谢谢大家。我复制并修改了默认模型活页夹以满足我的需要,但CodeJunkie的活页夹要干净得多。:)@user326502:您能否分享您的解决方案,使他的modelbinder与POST操作一起工作?