【问题标题】:Problem with MVC3 AllowHtml attributeMVC3 AllowHtml 属性的问题
【发布时间】:2013-03-12 05:36:49
【问题描述】:

我有一个基于 MVC3(没有测试版或候选发布,RTM/RTW 版本)的网络应用程序,它有一个接受 XML 文件进行处理的操作。

当然,这对 MVC 来说似乎很邪恶,因为可能会受到攻击,所以它不允许这样做。好吧,我尝试将 AllowHtml 放在模型对象上:

   public class XMLModel
    {
        [AllowHtml]
        public string msg { get; set; }
    }

或者我在我的操作方法上将 ValidateInput 设置为 false,例如:

    [ValidateInput(false)]
    public ActionResult AddCDR(XMLModel model)
    {
    }

首先使用“强”类型模型的原因是我最初尝试使用名为“msg”的字符串值作为操作方法参数,但结果总是空的。

现在,当有人在同一台计算机或联网计算机上向此表单发帖时,msg 字段始终为空白。

我已通过 WireShark 验证数据实际上在请求中。

现在,一件有趣的事情。 这对于 MVC 3 来说不是必需的。但它会产生细微的差别。

如果我将它添加到我的网络配置中:

<httpRuntime requestValidationMode="2.0" />

它适用于来自本地计算机的请求,但不适用于来自其他系统的请求。

我认为 AllowHtml 版本看起来很优雅 - 只要它有效。

我还发现了 RC2 中的一个错误 - 同样,这不应该影响我,但我还是尝试在 Application_Start() 中添加以下内容:

ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider();

正如预期的那样,它没有真正的区别。

在我的开发计算机(Win7x64、VS2010)上一切正常,但在目标系统(Win2008R2x64、IIS7.5)上,上述问题让我很难受。

非常重要的一点要注意:如果我在没有尖括号的情况下发布到操作,我会按预期获得表单数据。但是,一旦尖括号出现,要么根本不调用我的动作,要么在动作方法参数或例如 Request.Params["msg"] 中找不到表单数据应该是。

有什么想法可以让 XML 通过吗?

更新

在等待任何人在这里提出答案的同时,我试图解决这个问题。我还没有解决它,但我检查了一些额外的细节;

  • 首先,我验证了我的开发计算机和 Web 服务器上安装的 ASP.NET MVC 3 版本是相同的; v3.0.20105.0(根据添加/删除程序)。
  • Web 应用程序实际上是使用 MVC3 测试版创建的,然后在发布时转换为 RC1 和 RC2,最后转换为 RTM 版本。这意味着由于 ViewBag 的更改,我不得不修改一些代码。但是,由于我不知道具体发生了什么变化,所以我用 RTM 版本创建了一个全新的 MVC3 应用程序,创建了一个同名的控制器,具有相同的操作方法,采用与当前使用的模型对象相似的模型对象,重命名了旧的 Web 应用程序目录并将这个新的目录放置在适当的位置。完全相同的事情发生 - 即当请求是从本地机器发出时,具有 AllowHtml 属性的参数会包含所有内容,但如果它来自远程机器,那么 HTML(实际上是 XML)将被删除。
    • 也不例外。我已经安装了 Elmah 并验证了这一点 - 没有发生异常,我的操作方法显然只是用任何看起来像 XML 的东西从参数中剥离出来的方法调用。

不用说,这让我发疯了。昨天我有一些建议要查看 MVC3 的源代码,但不幸的是,这并没有真正帮助我,因为我看不到任何明显错误的地方,而且我无法在有问题的服务器上调试代码。

仍然非常需要任何见解,谢谢! :)

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    我无法重现这个。

    型号:

    using System.Web.Mvc;
    
    namespace MvcApplication3.Models {
        public class XmlModel {
            [AllowHtml]
            public string msg { get; set; }
        }
    }
    

    控制器:

    using System.Web.Mvc;
    using MvcApplication3.Models;
    
    namespace MvcApplication3.Controllers {
        public class HomeController : Controller {
            public ActionResult Index() {
                return View();
            }
    
            [HttpPost]
            public ActionResult Index(XmlModel model) {
                return View();
            }
        }
    }
    

    查看:

    @model MvcApplication3.Models.XmlModel
    
    @using (Html.BeginForm()) {
        <div class="editor-label">
            @Html.LabelFor(model => model.msg)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.msg)
            @Html.ValidationMessageFor(model => model.msg)
        </div>
    }
    

    这些已添加到默认的空 MVC 3 项目中。一切都很好。当我删除 [AllowHtml] 时,它会生成相应的错误消息。

    【讨论】:

    • 谢谢,布拉德,非常感谢!我自己在这方面取得了一些进展,希望今天能确认一个解决方案。
    【解决方案2】:

    我自己回答这个问题,因为这是一个晦涩难懂的情况,而 MVC3 不是问题所在。

    向我的应用程序发布数据的系统使用了格式错误的数据。除此之外,我被告知他们也在发布到一个运行良好的旧 MVC2 应用程序 - 这是错误的,事实证明他们在这种情况下正在获取,而 GET 他们碰巧做对了。

    如果有的话,相当彻底的测试已经证实 AllowHtml 属性实际上工作得很好。永远不要相信你的意见。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多