1

我正在开发 MVC 应用程序,现在正在测试它。

我正在尝试<test>在数据库中插入地址字段。由于它包含角括号,因此会出错。为此,我在控制器中使用以下代码。

[HttpPost]
public ActionResult Create(Employee employee)
{
    if (ModelState.IsValid)
    {
        employee.Address.Replace("<", "&lt;").Replace(">", "&gt;");
        db.Employees.Add(employee);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.ReportsToId = new SelectList(db.Employees, "Id", "FirstName", employee.ReportsToId);
    return View(employee);
}

但是光标没有出现在这段代码中。在哪里写替换代码?
在光标到达该代码之前,它给出了一个错误:

从客户端 (Address = "<test>") 检测到具有潜在危险的 Request.Form 值。

4

3 回答 3

2

更改employee.Address.Replace("<", "&lt;").Replace(">", "&gt;");employee.Address = employee.Address.Replace("<", "&lt;").Replace(">", "&gt;");

这样,它获取employee.Address字符串并替换<and>符号,然后将字符串保存回employee.Address.

它也可能需要在if (ModelState.IsValid)零件之前。

于 2012-08-28T08:11:05.143 回答
2

阅读此答案以了解类似问题。

结论:在[AllowHtml]属性上使用Address属性或更改 web.config 以使用 requestValidationMode 2.0:

<configuration>
   <system.web>
     <httpRuntime requestValidationMode="2.0" />
   </system.web>
   <pages validateRequest="false">
   </pages>
</configuration>
于 2012-08-28T07:46:35.277 回答
1

您的代码中有两个问题需要解决。

首先,正如您所指出的,错误:

A potentially dangerous Request.Form value was detected from the client (Address ="<test>").

发生此错误的原因是,为了安全起见,MVC 默认不允许将此类字符串(您就像一些 html 元素)发送到您的操作方法。那是为了防止用户提交一些危险的输入来附加您的站点。例如,您可以键入 alert('hahaha') 而不是 ,如果您不对该输入进行编码,则访问包含此地址字段的页面的每个人都会收到一个警告框。这就是为什么您在调试时无法进入“替换代码”,因为这个错误,整个方法将无法运行。

也就是说,有很多选项可以解决第一个错误,但您可以简单地将 ValidateInput 属性添加到您的操作方法中。

[HttpPost]
[ValidateInput(false)]
public ActionResult Create(Employee employee)

通过这样做,您是在告诉 MVC 相信您会在某个时候对危险的输入进行编码。而你正在通过替换代码来做到这一点。那很好。但是,如果您只是使用 @yourTable.Address 在某些视图中呈现数据,则无需费心在操作代码中替换 < 和 >。当您通过 @yourTable.Address 语法呈现数据时,MVC Razor 引擎会为您进行编码。

于 2012-08-28T23:50:12.283 回答