在哪里放'替换'代码?

时间:2012-08-28 07:36:39

标签: asp.net-mvc asp.net-mvc-3 entity-framework-4

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

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

[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);
}

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

  

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

3 个答案:

答案 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("<", "&lt;").Replace(">", "&gt;");更改为employee.Address = employee.Address.Replace("<", "&lt;").Replace(">", "&gt;");

这样,它会使用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引擎会为您进行编码。