바인딩하기 전에 request.form을 편집합니다
-
05-07-2019 - |
문제
action 메소드가 매개 변수에 바인딩하기 전에 요청을 편집하는 방법이 있습니까? 이미 Request.Form의 편집을 활성화하기 위해 반사 호출이 있습니다. 바인딩이 발생하기 전에 변경할 수있는 Extensibilty의 점을 찾을 수 없습니다.
업데이트 : 요청을 편집하고있는 것처럼 보입니다. 바운드 매개 변수를 보면서 확인했습니다. action 필터에 도달 할 때까지 B/C가 잘못되었습니다. 양식 값은 이미 ValueProvider에 복사/설정되었습니다. 나는 값이 바인딩을 위해 당기는 곳이라고 생각합니다.
따라서 문제는 일부 필터링이 묶기 전에 양식 값에 적용하는 가장 좋은 방법이됩니다. 나는 여전히 바인딩이 발생하기를 원합니다. 바인딩에 사용하는 값을 편집하고 싶습니다.
해결책 2
기본 동작을 진행하기 전에 값을 확인하기 위해 DefaultModelBinder의 SetProperty 메소드를 확장했습니다. 값이 문자열 인 경우 필터링을 수행합니다.
public class ScrubbingBinder : DefaultModelBinder
{
protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
{
if (value.GetType() == typeof(string))
value = HtmlScrubber.ScrubHtml(value as string, HtmlScrubber.SimpleFormatTags);
base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
}
}
다른 팁
사용자 정의 필터를 작성하고 재정의하십시오 OnActionExecuting()
:
public class CustomActionFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
}
}
또는 단순히 무시하십시오 OnActionExecuting()
컨트롤러에서
업데이트 :
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var actionName = filterContext.ActionDescriptor.ActionName;
if(String.Compare(actionName, "Some", true) == 0 && Request.HttpMethod == "POST")
{
var form = filterContext.ActionParameters["form"] as FormCollection;
form.Add("New", "NewValue");
}
}
public ActionResult SomeAction(FormCollection form)
{
...
}
제휴하지 않습니다 StackOverflow