gpt4 book ai didi

c# - 为 HTML 字符串使用自定义模型联编程序

转载 作者:太空狗 更新时间:2023-10-29 20:37:07 24 4
gpt4 key购买 nike

我正在尝试将用户输入的 HTML 字符串从 POST 绑定(bind)到模型对象上的简单字符串变量中。如果我使用 [AllowHtml] 属性,这很好用。但是,我想在 HTML 进入模型之前对其进行清理,因此我创建了一个 ModelBinder:

public class SafeHtmlModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerCtx, ModelBindingContext bindingCtx)
{
var bound = base.BindModel(controllerCtx, bindingCtx);
// TODO - return a safe HTML fragment string
return bound;
}
}

还有一个CustomModelBinderAttribute:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class SafeHtmlModelBinderAttribute : CustomModelBinderAttribute
{
public SafeHtmlModelBinderAttribute()
{
binder = new SafeHtmlModelBinder();
}

private IModelBinder binder;

public override IModelBinder GetBinder()
{
return binder;
}
}

然后我注释我想用新属性清理的模型属性:

[Required(AllowEmptyStrings = false, ErrorMessage = "You must fill in your profile summary")]
[AllowHtml, SafeHtmlModelBinder, WordCount(Min = 1, Max = 300)]
public string Summary { get; set; }

这是遵循 http://msdn.microsoft.com/en-us/magazine/hh781022.aspx 中的示例.不幸的是,它似乎不起作用!如果我在我的 BindModel 方法中放置一个断点,它永远不会被命中。有什么想法吗?

更新

根据 Joel 提供的信息,我更改了 IModelBinder 以拦截 SetProperty 方法中的值,而是将 SafeHtmlModelBinderAttribute 应用于包含字符串属性的类包含 HTML。代码检查该属性是否为字符串,并且在尝试清理之前也允许包含 HTML:

public class SafeHtmlModelBinder : DefaultModelBinder
{
protected override void SetProperty(
ControllerContext controllerCtx,
ModelBindingContext bindingCtx,
PropertyDescriptor property,
object value)
{
var propertyIsString = property.PropertyType == typeof(string);
var propertyAllowsHtml = property.Attributes.OfType<AllowHtmlAttribute>().Count() >= 1;

var input = value as string;
if (propertyIsString && propertyAllowsHtml && input != null)
{
// TODO - sanitize HTML
value = input;
}

base.SetProperty(controllerCtx, bindingCtx, property, value);
}
}

最佳答案

我一直在为同样的事情而苦苦挣扎。似乎从未调用过 GetBinder() 方法。四处挖掘后,我发现 this post其中公认的答案是不可能为属性放置模型绑定(bind)属性。

我不知道这是不是真的,但现在我只是想尝试以不同的方式实现我需要做的事情。一个想法是创建一个更通用的 ModelBinder 并在执行绑定(bind)时检查您的属性是否存在,类似于 this answer 中的建议。 .

关于c# - 为 HTML 字符串使用自定义模型联编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12705978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com