我正在开发MVC应用程序,现在正在测试它。
我正在尝试在数据库地址字段中插入<test>
。由于它包含anguler括号,它给出了一个错误。为此,我在控制器中使用以下代码。
[HttpPost]
public ActionResult Create(Employee employee)
{
if (ModelState.IsValid)
{
employee.Address.Replace("<", "<").Replace(">", ">");
db.Employees.Add(employee);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ReportsToId = new SelectList(db.Employees, "Id", "FirstName", employee.ReportsToId);
return View(employee);
}
但是光标没有来到这个代码。在哪里写替换代码?
在光标到达该代码之前,它给出了一个错误:
从客户端检测到潜在危险的Request.Form值 (地址=
"<test>"
)。
答案 0 :(得分:2)
阅读此answer以了解类似问题。
结论:对[AllowHtml]
属性使用Address
属性或更改web.config以使用requestValidationMode 2.0:
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
答案 1 :(得分:2)
将employee.Address.Replace("<", "<").Replace(">", ">");
更改为employee.Address = employee.Address.Replace("<", "<").Replace(">", ">");
这样,它会使用employee.Address
字符串并替换<
和>
符号,然后将字符串保存回employee.Address
。
此外,它可能需要在if (ModelState.IsValid)
部分之前。
答案 2 :(得分:1)
您必须解决代码中的两个问题。
首先,正如您所指出的,错误:
A potentially dangerous Request.Form value was detected from the client (Address ="<test>").
发生此错误是因为,为了安全起见,MVC不允许将此类字符串(您的某些html元素)默认发送到您的操作方法。这是为了防止用户提交一些危险的输入来附加您的网站。例如,您可以键入alert('hahaha'),如果您不对该输入进行编码,则每个人访问包含此地址字段的页面都会获得一个警告框。这就是为什么在调试时无法访问“替换代码”的原因,整个方法因为这个错误而无法运行。
也就是说,有很多选项可以解决这个第一个错误,但你可以简单地在你的action方法中添加一个ValidateInput属性。
[HttpPost]
[ValidateInput(false)]
public ActionResult Create(Employee employee)
通过这样做,您告诉MVC相信您将在某个时刻编码该危险输入。你正在通过替换代码来做到这一点。那很好。但是,如果您只是使用@ yourTable.Address在某些视图中呈现数据,则无需费心替换&lt;和&gt;在你的动作代码中。当您通过@ yourTable.Address语法呈现数据时,MVC Razor引擎会为您进行编码。