gpt4 book ai didi

c# - PropertyDescriptor.SetValue 在 ModelBinder 中不起作用

转载 作者:行者123 更新时间:2023-11-30 17:17:17 26 4
gpt4 key购买 nike

我正在实现自定义 ModelBinder,我试图用 PropertyDescriptor.SetValue 设置一个属性我不明白为什么它不起作用。

对于某些复杂属性,未设置值但不会引发异常。该属性仍然是 null,但对某些人来说它确实如此。

如果我检索到 PropertyInfo并调用SetValue每次都工作得很好。

Mvc source from codeplex在内部使用 propertyDescriptor.SetValue(bindingContext.Model, value); 所以我猜这是最好的方法?

public class MyCustomBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(bindingContext.Model))
{
object value = property.GetValue(bindingContext.Model);
// Perform custom bindings

// Call SetValue on PropertyDescriptor (Works sometimes)
property.SetValue(bindingContext.Model, value);
Debug.Assert(property.GetValue(bindingContext.Model) == value, "Value not set");

// Get PropertyInfo and call SetValue (Working)
bindingContext.ModelType.GetProperty(property.Name).SetValue(bindingContext.Model, value, null);
Debug.Assert(property.GetValue(bindingContext.Model) == value, "Value not set");
}
return bindingContext.Model;
}
}

注意 1:我反射(reflect)的对象是用 nhibernate 映射的,所以我怀疑代理可能有问题。

注意 2:它也不能与 DefaultModelBinder 一起使用,但正在重新创建对象,因此发布的数据没有问题。

最佳答案

我不确定您想要实现什么,但我会忽略 MVC 源代码使用 propertyDescriptor.SetValue 这一事实,如果您已经知道 propertyInfo.setValue 可以满足您的需求。您正在编写一个扩展类,只需使用有效的代码即可:

Type modelType = bindingContext.ModelType;
foreach (PropertyInfo property in modelType.GetProperties())
{
// ...
property.SetValue(bindingContext.Model, value, null);
}

关于c# - PropertyDescriptor.SetValue 在 ModelBinder 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602435/

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