我正在尝试实现自定义ModelBinder
重载以下创建方法,以允许我绑定到抽象类。
protected override object CreateModel(ControllerContext controllerContext,
ModelBindingContext bindingContext,
Type modelType){
const string WidgetId = "WidgetId";
ValueProviderResult widgetIdResult = bindingContext.ValueProvider
.GetValue(WidgetId);
if (widgetIdResult == null)
{
throw new Exception("Widget id for abstract class not specified.");
}
IWidget widget =
(IWidget)ContentHelper.GetNodeById(int.Parse(widgetIdResult.AttemptedValue));
IRenderWidget instance =
widget.BuildViewModel(ConverterHelper.Instance.UmbracoHelper);
bindingContext.ModelMetadata =
ModelMetadataProviders.Current
.GetMetadataForType(() => instance, instance.GetType());
return instance;
}
使用上面的代码,我能够成功创建一个继承我的抽象类型的类的实例。
我不能做的是从表单中填充具有属性表单的模型的值。一旦我到达我的ActionResult,表单值为空。
public ActionResult SubmitForm(RenderModel model,
[ModelBinder(typeof(FormWidgetModelBinder))]RenderFormBase form)
使用TryUpdate
this.TryUpdateModel(form);
不起作用。
有人可以演示如何绑定表单值吗?
如果我使用评论中链接的示例,我会收到以下错误。
参数字典包含参数的无效条目 'form'用于方法'System.Web.Mvc.ActionResult SubmitForm(Umbraco.Web.Models.RenderModel, Site.Models.ViewModels.DocumentTypes.Widgets.RenderFormBase)'in 'Site.Controllers.WidgetPageController'。这本词典包含一个 类型的价值 'Site.Models.ViewModels.DocumentTypes.Widgets.RenderContactUs',但 该参数需要值类型 'Site.Models.ViewModels.DocumentTypes.Widgets.RenderFormBase'。 参数名称:参数