- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我们的 MVC 2 应用程序中,我们有一个像这样实现的 JSON 模型绑定(bind)器:
public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string input;
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
input = reader.ReadToEnd();
}
return JsonConvert.DeserializeObject(
input,
bindingContext.ModelType);
}
更新到 MVC 4 后,我注意到我们为传入的 JSON 帖子获取了空传入模型。当深入挖掘时,很明显上游的东西正在插入溪流。这很容易修复,就像这样
public virtual object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string input;
//something upstream after MVC 4 upgrade is advancing the stream to end before we can read it
controllerContext.HttpContext.Request.InputStream.Position = 0;
using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
{
input = reader.ReadToEnd();
}
return JsonConvert.DeserializeObject(
input,
bindingContext.ModelType);
}
但我想知道发生了什么使得必须进行更改?之前的实现只是巧合吗?
最佳答案
不,之前的实现并非巧合。
ASP.NET MVC 3
引入了内置 JSON 绑定(bind)支持,使操作方法能够接收 JSON 编码数据并将其模型绑定(bind)到操作方法参数。
JsonValueProviderFactory
默认在 ASP.NET MVC 3
及以后的版本中注册。 JSON
值提供程序在模型绑定(bind)之前运行并将请求数据序列化到字典中。然后将字典数据传递给 model binder
。
让我们看看 JsonValueProviderFactory
是如何工作的。这里是 ASP.NET MVC 开源代码 JsonValueProviderFactory.cs 中提供的 JsonValueProviderFactory
的源代码链接。
GetDeserializedObject
方法,在 JsonValueProviderFactory.cs
中定义,如果设置了 Content-Type
,则读取 stream
到 application/json
,因此它将 Request.InputStream
留在流的末尾。所以这里先调用GetDeserializedObject
,再调用BindModel
。自从GetDeserializedObject
已经读取了一次流并将Request.InputStream
推进到流的末尾,我们需要重新设置Request.InputStream
在 BindModel
private static object GetDeserializedObject(ControllerContext controllerContext)
{
if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
{
// not JSON request
return null;
}
StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
string bodyText = reader.ReadToEnd();
if (String.IsNullOrEmpty(bodyText))
{
// no JSON data
return null;
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
object jsonData = serializer.DeserializeObject(bodyText);
return jsonData;
}
关于c# - 在到达 ModelBinder 之前推进 Request.InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27273122/
我正在自定义 phpUnderControl 构建文件以使用 symfony propel:build-sql 功能生成要为每个构建(不是每个测试)加载的 .sql 文件。我遇到的情况是,生成的 .s
我有 table : Article: ID | TITLE | CONTENT 1 | aaa+s | sdsd 2 | ccc+a | sdsda 3 | aaa+s | dsdsd 4
我创建了一个本地应用程序,它使用 ajax 从 SQL 数据库调用结果。 系统运行良好,但是如果使用 ' 进行某些搜索,则系统失败并且我收到以下错误“注意:数组到字符串的转换 in..” 这是我的 J
我在我的 PHP 应用程序中使用 propel ORM。 通过阅读文档,我不知道如何发出这种类型的请求: SELECT x FROM table where col1 = 'xxx' and not(
我正在尝试使用 Propel 1.6 使用自定义“order by”进行查询 select * from myObject ORDER BY FIELD(id, 3, 11, 7, 1) 这不起作用:
我有一个 MySQL 表,其中包含从用户到用户的所有消息: id | to_id /*user_id*/ | from_id /*user_id*/ 1 | 32 |
我正在使用 symfony 开始一个新项目很容易与 Doctrine 集成和 Propel ,但我当然需要做出选择.... 非常感谢。 编辑:感谢所有回复,有用的东西。这个问题没有真正正确的答案,所以
我有一个产品对象和评级对象,它们代表对产品的评级。评级有一个名为“value”的属性,它是一个从 1 到 5 的整数。 对于给定的产品,我想获得所有评级值的平均值。我知道如何获得所有评级: $prod
我正在通过 MySQL Server 5.5.28 使用与 Propel 1.6.7 集成的 Symfony 2.1.6 框架作为数据库 ORM,我在将数据库排序规则设置为 utf8_unicode_
我正在尝试使用 Propel 2 对数据库进行逆向工程。但是每次我尝试运行 model:build 命令时,我都会收到以下错误: [Propel\Generator\Exception\Invalid
我正在尝试获取 propel 中列的总和。我的代码 $c = new Criteria(); $c->add(valuePeer::OWNER_ID, $this->getId()); $c->add
我们有一个包含所有产品的表格和一个包含所有订购商品的单独表格。订购的商品基本上是已订购产品的副本,与其源产品相关(通过外键)和仅与订购商品相关的附加数据,如订购数量。 通过这种方式,我们确保了订单数据
有没有人建议使用外部 ORM,如 Doctrine/Propel 而不是 Zend Framework 中的默认 Zend_Db_Table? 我认为您的回答和理由对整个 ZF 社区都很有值(valu
我正在尝试按年份对现有表进行分区。(没有现有分区) alter table test_table PARTITION BY EXTRACT (year FROM date_c); 但是好像有一些错误
我有大型 MySQL 数据库。我想一次获取 100 行,直到处理完所有数据库。 protected function doEcho($msg){ static $time, $start;
我正在使用 Symfony 1.4.8 和 Mysql 5.5 运行时出现此错误 symfony 推进:构建全部 You have an error in your SQL syntax; check
我想将自定义 sql 子查询插入到常见的 Propel 标准中。子查询包含用户输入,因此必须对这些输入进行转义。我怎样才能实现这一点? 我有这样的东西(简化): $c = new Criteria()
我是一名优秀的程序员,十分优秀!