She*_*ock 6 asp.net webforms defaultmodelbinder modelbinders
多年来我做了ASP.NET Web表单开发我被一个专有库所破坏,这让我可以做以下事情:
UpdateToObject(ControlsCollection, obj)
UpdateFromObject(ControlsCollection, obj)
Run Code Online (Sandbox Code Playgroud)
概念上,代码做了一些与MVC Model Binder非常相似的东西,即将表单的发布值作为输入,它将填充自定义对象.基本上它使开发人员免于做猴子代码,如
employee.Name = txtName.Text;
employee.DOB = DateTime.Parse(txtDOB.Text);
Run Code Online (Sandbox Code Playgroud)
等等..
现在,这个专有的库在我参与的新项目中不可用,它是一个Web表单项目.所以我想知道是否有一种System.Web.Mvc.DefaultModelBinder在Web表单的上下文中使用的方法.目标是从域对象和背面实现简单和容易的控制,最好考虑验证注释.如果不可能,有人可能会指出我的开源解决方案来满足这种需求.我真的不想重写这样的代码.
提前致谢.
Sherlock,您在尝试使用 MVC 中的 ModelBinder 时会遇到一些问题,因为它们依赖于 ControllerContext。
\n\n我之前回答过类似的问题ChangeType,Convert - 从一种类型转换为另一种类型,但这确实是您正在寻找的。
\n\n查看我的博客上的这篇博文\n ChangeType \xe2\x80\x93 更改 C# 中变量的类型
\n\n本质上,您会调用一个方法,ChangeType<T>该方法以强类型方式返回您正在查找的参数值,如果参数不存在,则返回默认值。
现在关于自定义类(主要是 DTO 类型类),如果您不介意使用反射,那么我有一个也可以处理大多数自定义类的解决方案。本书最后提到的 DtoBinder 类做得很好。
\n\n本质上,最后 3 个代码清单包含了处理典型 Web 应用程序场景中几乎所有需求所需的所有代码。另外,它是可扩展的,因此如果您需要实现自己的活页夹,您可以非常简单地做到这一点,并从应用程序中的任何位置向 RequestBinder 注册您的活页夹。
\n\n因此,如果您不想对某些经常使用的 DTO 对象使用反射,您可以为该类型实现一个绑定器并注册它,从那时起它将使用您的自定义绑定器。在很多方面,它的概念与 MVC ModelBinder 类似。
\n\n编辑-
\n\n下面是一个 .cs 文件,其中包含我过去用来完成您所需要的操作的一堆类。第一个 MsPropertyAssignerProvider 是您在页面中使用的那个。
\n\n您将迭代控件并调用 GetPropertyAssigner 方法,并向其传递控件的类型名称。此方法返回一个 ObjectPropertyAssigner 的实例,该实例具有一个名为 SetPropertyValue 的方法,您可以将对象实例和控件实例传递给该方法。
\n\n internal class MsPropertyAssignerProvider\n {\n private Hashtable propertyAssigners;\n\n internal MsPropertyAssignerProvider()\n {\n propertyAssigners = new Hashtable();\n RegisterPropertyAssigner(typeof(TextBox).ToString(), new TextBoxValueExtractor());\n RegisterPropertyAssigner(typeof(DropDownList).ToString(), new DropDownListValueExtractor());\n RegisterPropertyAssigner(typeof(Label).ToString(), new LabelValueExtractor());\n RegisterPropertyAssigner(typeof(CheckBox).ToString(), new CheckBoxValueExtractor());\n }\n\n internal void RegisterPropertyAssigner(string identifier, IMsObjectPropertyAssigner assigner)\n {\n if (propertyAssigners.ContainsKey(identifier))\n throw new DuplicatePropertyAssignerRegistrationException(identifier);\n propertyAssigners.Add(identifier, assigner);\n } \n\n internal IMsObjectPropertyAssigner GetPropertyAssigner(string identifier)\n {\n return (propertyAssigners.ContainsKey(identifier)) ? (IMsObjectPropertyAssigner)propertyAssigners[identifier] : null;\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n下面列出了附带的类
\n\n public interface IMsObjectPropertyAssigner\n {\n void SetPropertyValue(object obj, System.Web.UI.Control control); \n }\n\n internal abstract class BaseValueExtractor : IMsObjectPropertyAssigner\n {\n protected MsReflectionHelper reflectionHelper = new MsReflectionHelper();\n protected string FixStringForNumber(string stringValue)\n {\n if (stringValue.Length == 0)\n return "0";\n else\n return stringValue;\n }\n public abstract void SetPropertyValue(object obj, System.Web.UI.Control control);\n }\n\n internal class TextBoxValueExtractor : BaseValueExtractor\n {\n public override void SetPropertyValue(object obj, System.Web.UI.Control control)\n {\n TextBox textBox = (TextBox)control;\n PropertyInfo propInfo = reflectionHelper.GetPropertyInfo(obj, control.ID);\n Type propType = propInfo.PropertyType;\n if (propType == typeof(System.String))\n reflectionHelper.SetPropertyValue(obj, control.ID, textBox.Text);\n else if (propType == typeof(System.Int16))\n reflectionHelper.SetPropertyValue(obj, control.ID, Int16.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency));\n else if (propType == typeof(System.Int32))\n reflectionHelper.SetPropertyValue(obj, control.ID, Int32.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency));\n else if (propType == typeof(System.Int64))\n reflectionHelper.SetPropertyValue(obj, control.ID, Int64.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency));\n else if (propType == typeof(System.Double))\n reflectionHelper.SetPropertyValue(obj, control.ID, Double.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency));\n else if (propType == typeof(System.Single))\n reflectionHelper.SetPropertyValue(obj, control.ID, Single.Parse(FixStringForNumber(textBox.Text), System.Globalization.NumberStyles.Currency));\n else\n reflectionHelper.SetPropertyValue(obj, control.ID, textBox.Text);\n }\n }\n\n internal class DropDownListValueExtractor : BaseValueExtractor\n {\n public override void SetPropertyValue(object obj, System.Web.UI.Control control)\n {\n DropDownList dropDownList = (DropDownList)control;\n reflectionHelper.SetPropertyValue(obj, control.ID, dropDownList.SelectedValue);\n }\n }\n\n internal class LabelValueExtractor : BaseValueExtractor\n {\n public override void SetPropertyValue(object obj, Control control)\n {\n Label label = (Label)control;\n reflectionHelper.SetPropertyValue(obj, control.ID, label.Text);\n }\n }\n\n internal class CheckBoxValueExtractor : BaseValueExtractor\n {\n public override void SetPropertyValue(object obj, Control control)\n {\n CheckBox checkbox = (CheckBox)control;\n reflectionHelper.SetPropertyValue(obj, control.ID, checkbox.Checked);\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n抱歉,无论我做什么,编辑器都会完全搞乱代码清单。但我希望这会有所帮助。
\n| 归档时间: |
|
| 查看次数: |
1755 次 |
| 最近记录: |