使用标记保存文本时出错

时间:2012-08-28 05:13:12

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

我正在使用EF 4.0开发MVC应用程序。

我正在尝试将值<test>放到地址字段中,但在保存时会出现以下错误,如何解决?

从客户端检测到一个潜在危险的Request.Form值(Address =“<test>”)。

修改

请检查以下代码

namespace CEntities
{
    [MetadataType(typeof(EmployeeMetaData))]
    public partial class Employee
    {
    }

     /// <summary>
     /// Holds the validations for Employee class
     /// </summary>
     public class EmployeeMetaData
     {
         [Key]
         public int Id { get; set; }
         [Required]
         [StringLength(50, ErrorMessage = "First name can accept maximum 50 characters.")]
         public string FirstName { get; set; }

         [StringLength(50, ErrorMessage = "Last name can accept maximum 50 characters.")]
         public string LastName { get; set; }

         [StringLength(1000, ErrorMessage = "Address can accept maximum 1000 characters.")]
         public string Address { get; set; }
      }
}

3 个答案:

答案 0 :(得分:0)

您可以使用ValidateInput(false)关闭Request Validation,也可以将[AllowHtml]属性添加到模型属性

已修改

在地址模型属性上添加[AllowHtml]属性。

[StringLength(1000, ErrorMessage = "Address can accept maximum 1000 characters.")]
[AllowHtml]
public string Address { get; set; }

并在顶部添加using System.Web.Mvc;指令。

您使用的是Assembly System.Web.Mvc.dll,版本4还是版本2.

[AllowHtml]属性位于Assembly System.Web.Mvc.dll, version 4。检查你的程序集版本以应用它。

答案 1 :(得分:0)

请检查以下代码

  

命名空间CEntities

{

[MetadataType(typeof(EmployeeMetaData))]

公共部门班员工

{



}
 /// <summary>
 /// Holds the validations for Employee class
 /// </summary>
 public class EmployeeMetaData
 {
     [Key]
     public int Id { get; set; }
     [Required]
     [StringLength(50, ErrorMessage = "First name can accept maximum 50 characters.")]
     public string FirstName { get; set; }
     [StringLength(50, ErrorMessage = "Last name can accept maximum 50 characters.")]
     public string LastName { get; set; }

     [StringLength(1000, ErrorMessage = "Address can accept maximum 1000 characters.")]
     public string Address { get; set; }

  }

}

答案 2 :(得分:0)

@YograjGupta给了你一个很好的答案,我不确定为什么[AllowHtml]不起作用。另一个选项是在控制器中,如果将EmployeeMetaData保存到数据库,则可以在保存更改之前添加db.Configuration.ValidateOnSaveEnabled = false;。您还必须删除if(ModelState.IsValid)部分。

另一种选择是将<>替换为employeeMetaData.Address.Replace("<", "&lt;").Replace(">", "&gt;")

请注意,如果您使用[AllowHtml]属性,则会使您更容易受到黑客攻击,因此您可能希望在最终版本发布之前将其删除。或者您可以添加Microsoft.Security.Application并执行Sanitizer.GetSafeHtmlFragment(address)之类的操作来移除不安全的HTML。

修改

您的控制器应如下所示:

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

或者你可以试试这个:

public ActionResult Create(Employee employee)
{
    db.Configuration.ValidateOnSaveEnabled = false;
    db.Employees.Add(employee);
    db.SaveChanges();
    return RedirectToAction("Index");
}

db是您的数据库,Employee是您数据库中的Employee表。