当然,这似乎是由于可能的攻击而对MVC而言是邪恶的,所以它不允许它.那么我试着把AllowHtml放在模型对象上呢?
public class XMLModel { [AllowHtml] public string msg { get; set; } }
或者我将ValidateInput设置为false,我的操作方法如下所示:
[ValidateInput(false)] public ActionResult AddCDR(XMLModel model) { }
首先有一个“强”类型的模型的原因是我最初尝试使用一个名为“msg”的字符串值作为action方法参数,但总是返回空.
现在,当有人在同一台机器上或从联网的计算机发布到此表单时,msg字段始终为空.
我已经与WireShark验证了数据实际上是在请求中.
现在有一件有趣的事情.这不应该与MVC 3是必要的.但它有微小的差异.
如果我添加到我的网络配置:
<httpRuntime requestValidationMode="2.0" />
它适用于从本地计算机发出的请求,但它不能从另一个系统工作.
我认为AllowHtml版本似乎很优雅 – 如果只是有效.
我也发现了RC2中的一个bug – 再次,这不应该影响我,但是我试图在Application_Start()中添加以下内容:
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();
正如预期的那样,没有什么不同.
一切都符合我的开发计算机(Win7x64,VS2010)的预期,但目标系统(Win2008R2x64,IIS7.5)上面的问题给我一个困难的时刻.
非常重要的一点要注意:如果我发布到没有尖括号的动作,我会按预期得到表单数据.只要尖括号出现了,我的动作根本就没有被调用,或者没有找到表单数据,也没有在动作方法参数中或者在Request.Params [“msg”]中找到它应该.
任何想法允许XML通过?
UPDATE
我已经试图解决这个问题,等待任何人在这里提出答案.我还没有解决,但我已经检查了一些额外的细节;
>首先,我验证了我的开发计算机和Web服务器上安装的ASP.NET MVC 3版本是一样的; v3.0.20105.0(根据添加/删除程序).
> Web应用程序实际上是使用MVC3测试版创建的,然后在出现时转换为RC1和RC2,最后转换为RTM版本.这意味着由于ViewBag的更改,我不得不修改一些代码.然而,由于我不知道其他什么改变了,所以我创建了一个全新的MVC3应用程序与RTM版本,创建一个同名的控制器,使用相同的动作方法,采用类似于当前使用的模型对象,重命名旧的Web应用程序目录,并将这个新的一个到位.发生同样的事情 – 即当从本地机器发出请求时,带有AllowHtml属性的参数会带有所有内容,但是如果它来自远程机器,则HTML(实际上是XML)将被剥离.
>也没有例外.我已经安装了Elmah,并验证了这一点 – 没有异常发生,我的action方法显然只是调用了像从XML中删除的任何东西从参数到方法.
不用说,这让我很疯狂.昨天我有一些建议来看看MVC3的源代码,但不幸的是,这并没有真正帮助我,因为我看不到任何明显的错误,我无法在有问题的服务器上调试代码.
任何见解仍然非常希望,谢谢!