我有以下Nancy模块。
public class MyFooTestModule : NancyModule
{
public MyFooTestModule()
{
Post["/text"] = _ =>
{
//string myNewText = this.Bind<string>(); // Fails, because string has no parameterless constructor
string myNewText = Request.Body.AsString();
return Response.AsJson(myNewText);
};
}
}
我希望绑定到单个string
变量。但是,我不能使用this.Bind<string>()
,例如使用this.Bind<int>()
,因为在运行时我得到一个异常告诉我:
System.MissingMethodException: No parameterless constructor defined for this object.
如果我使用Request.Body.AsString()
代替,则字符转义无法正常工作,我最终会在我的变量中使用多个引号并转义反斜杠。
更准确地说,当我发布JavaScript字符串
时"Hello\r\nWorld Foo!"
从客户端,我收到echo JavaScript字符串
"\"Hello\\r\\nWorld Foo!\""
来自服务器。
将JSON请求主体绑定到原始string
变量的正确原因是什么?我不想将每个原始类型包装到一个无用的容器类中,只是为了交换我的JavaScript客户端中使用的string
变量。
答案 0 :(得分:0)
这很可能是C#设计决策的结果,再加上框架内序列化的常见做法。字符串类型是不可变的 - 一旦创建实例就无法更改。序列化的常用方法尝试创建所需类型的实例并分配其成员值。 另一种方法是将值作为参数传递
Post["/text/{userString:string}"] = parameter =>
{
// access the value herewith something like
string theString = parameter.userString
}
在我的脑海中,大多数其他原语都可以工作,只有字符串是不可变的,尽管有几种内置类型不会起作用,例如元组和日期时间。