사용자가 ASP.net MVC를 사용하여 특정 필드에 HTML을 입력하도록 허용하려면 어떻게해야합니까?
컨트롤러에서이 복잡한 개체에 매핑되는 많은 필드가있는 긴 형식이 있습니다.
하나의 필드 (설명)가 HTML을 허용하도록 만들고 싶습니다. HTML은 나중에 나만의 위생을 수행 할 것입니다.
사용자가 ASP.net MVC를 사용하여 특정 필드에 HTML을 입력하도록 허용하려면 어떻게해야합니까?
컨트롤러에서이 복잡한 개체에 매핑되는 많은 필드가있는 긴 형식이 있습니다.
하나의 필드 (설명)가 HTML을 허용하도록 만들고 싶습니다. HTML은 나중에 나만의 위생을 수행 할 것입니다.
답변:
HTML을 허용하려는 컨트롤러의 작업 (게시)에 다음 속성을 추가합니다.
[ValidateInput(false)]
편집 : 당으로 Charlino의 의견 :
web.config에서 사용되는 유효성 검사 모드를 설정하십시오. MSDN 참조 :
<httpRuntime requestValidationMode="2.0" />
2014 년 9 월 편집 : 스프린터에 따라 252 개의 댓글 :
이제 [AllowHtml]
속성을 사용해야 합니다. MSDN 에서 아래를 참조하십시오 .
ASP.NET MVC 3 응용 프로그램의 경우 모델에 HTML을 다시 게시해야 할 때 ValidateInput (false)을 사용하여 요청 유효성 검사를 끄지 마십시오. 다음과 같이 모델 속성에 [AllowHtml]을 추가하면됩니다.
public class BlogEntry { public int UserId {get;set;} [AllowHtml] public string BlogText {get;set;} }
<httpRuntime requestValidationMode="2.0" />
web.config 파일 에서도 설정 해야합니다.
무엇에 대한 [AllowHtml]
특성 위의 속성?
MetadataTypeAttribute
하며 전체 개체가 아닌 개별 필드에 대한 HTML 만 허용하므로 더 좋습니다.
[AllowHtml]
보안 수준을 낮출 것을 제안하는 블로그와 댓글이 많이 있으므로 특정 속성을 추가 하는 것이 권장되는 솔루션입니다.
이를 추가하면 MVC 프레임 워크는 컨트롤러가 히트하고 해당 컨트롤러의 코드가 실행되도록합니다.
그러나 코드, 필터 등에 따라 응답이 생성되는 방식과 다른 유사한 오류를 트리거 할 수있는 추가 유효성 검사가 있는지 여부에 따라 다릅니다.
어쨌든 [AllowHtml]
속성을 추가 하면 컨트롤러에서 html을 역 직렬화 할 수 있으므로 정답입니다. 뷰 모델의 예 :
[AllowHtml]
public string MessageWithHtml {get; set;}
[System.Web.Mvc.AllowHtml]
몇 가지 답변에서 설명한 것처럼 관련 속성에 추가했지만 동일한 문제에 직면했습니다 .
제 경우에는 MVC 유효성 검사가 발생 하기 전에UnhandledExceptionFilter
Request 개체에 액세스 하는 클래스가 있으므로 AllowHtml이 효과가 없으며이 액세스는 .[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
즉, Request 객체의 특정 속성에 액세스하면 암시 적으로 유효성 검사가 시작됩니다 (내 경우에는 Params
속성).
유효성 검사를 방지하는 솔루션은 MSDN에 문서화되어 있습니다.
요청의 특정 필드 (예 : 입력 요소 또는 쿼리 문자열 값)에 대한 요청 유효성 검사를 비활성화하려면 다음 예제와 같이 항목을 가져올 때 Request.Unvalidated 메서드를 호출합니다.
따라서 이와 같은 코드가 있으면
var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
...
그것을 변경
var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;
var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
...
또는 Form
유효성 검사를 실행하지 않는 속성을 사용하십시오.
var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
...
액션 메소드 매개 변수 ( "모델 속성"과 반대)에 html 입력을 허용해야하는 경우 이를 수행하는 기본 제공 방법이 없지만 사용자 정의 모델 바인더를 사용하여 쉽게 수행 할 수 있습니다.
public ActionResult AddBlogPost(int userId,
[ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
//...
}
AllowHtmlBinder 코드 :
public class AllowHtmlBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var name = bindingContext.ModelName;
return request.Unvalidated[name]; //magic happens here
}
}
내 블로그 게시물에서 전체 소스 코드와 설명을 찾으십시오. https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
NopCommerce를 사용하여 E-Commerce 사이트를 개발하는 동안이 문제에 직면했으며 이전 답변과 같이 3 가지 방법 으로이 솔루션을 얻었습니다. 그러나 NopCommerce 구조에 따르면 한 번에 세 가지를 찾지 못했습니다. 나는 그들이 단지 사용 [AllowHtml]
하고 있고 어떤 문제를 제외하고는 잘 작동 한다는 것을 방금 보았습니다 . 이전 질문으로 질문
개인적으로 저는 [ValidateInput(false)]
안전하지 않은 전체 모델 엔티티 검사를 건너 뛰기 때문에 선호하지 않습니다 . 하지만 누군가가 글을 쓰면 여기를보세요
[AllowHtml]
public string BlogText {get;set;}
그런 다음 단일 속성 만 건너 뛰고 특정 속성 만 허용하고 다른 모든 항목을 거의 확인하지 않습니다. 그러므로 그것은 나의 것보다 선호되는 것 같다.