Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NancyFx将模型绑定到动态类型?_C#_.net_Model Binding_Nancy - Fatal编程技术网

C# NancyFx将模型绑定到动态类型?

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

在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["/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操作一起工作?