gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - 接口(interface)类型上的自定义模型绑定(bind)器

转载 作者:行者123 更新时间:2023-12-03 12:45:44 26 4
gpt4 key购买 nike

我不确定这种行为是否是预期的,但是当绑定(bind)分配给接口(interface)类型时,自定义模型绑定(bind)似乎不起作用。有没有人尝试过这个?

public interface ISomeModel {}
public class SomeModel : ISomeModel {}

public class MvcApplication : HttpApplication {
protected void Application_Start(object sender, EventArgs e) {
ModelBinders.Binders[typeof(ISomeModel)] = new MyCustomModelBinder();
}
}

当我绑定(bind)到 SomeModel 类型的模型时,使用上面的代码,MyCustomModelBinder 永远不会被命中;但是,如果我更改上面的代码并替换为 typeof(ISomeModel)对于 typeof(SomeModel)并发布与预期完全相同的 MyCustomModelBinder 表单。这看起来对吗?

编辑

在我最初提出这个问题一年多之后,我发现自己又回到了这个困境中,现在我有了一个可行的解决方案。谢谢马特·希丁格!

http://www.matthidinger.com/archive/2011/08/16/An-inheritance-aware-ModelBinderProvider-in-MVC-3.aspx

最佳答案

我正在试验这个问题,我想出了一个解决方案。我创建了一个名为 InterfaceModelBinder 的类:

public class InterfaceModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ModelBindingContext context = new ModelBindingContext(bindingContext);
var item = Activator.CreateInstance(
Type.GetType(controllerContext.RequestContext.HttpContext.Request.Form["AssemblyQualifiedName"]));

Func<object> modelAccessor = () => item;
context.ModelMetadata = new ModelMetadata(new DataAnnotationsModelMetadataProvider(),
bindingContext.ModelMetadata.ContainerType, modelAccessor, item.GetType(), bindingContext.ModelName);

return base.BindModel(controllerContext, context);
}
}

我在我的 Application_Start 中这样注册:
ModelBinders.Binders.Add(typeof(IFormSubmission), new InterfaceModelBinder.Models.InterfaceModelBinder());

接口(interface)和具体实现如下所示:
public interface IFormSubmission
{
}

public class ContactForm : IFormSubmission
{
public string Name
{
get;
set;
}

public string Email
{
get;
set;
}

public string Comments
{
get;
set;
}
}

整个方法的唯一缺点(您可能已经收集到)是我需要从某个地方获取 AssemblyQualifiedName ,在此示例中,它被存储为客户端的隐藏字段,如下所示:
<%=Html.HiddenFor(m => m.GetType().AssemblyQualifiedName) %>

我不确定将类型名称暴露给客户端的缺点是否值得失去这种方法的好处。像这样的 Action 可以处理我所有的表单提交:
[HttpPost]
public ActionResult Process(IFormSubmission form)
{
if (ModelState.IsValid)
{
FormManager manager = new FormManager();
manager.Process(form);
}

//do whatever you want
}

对这种方法有什么想法吗?

关于asp.net-mvc - ASP.NET MVC - 接口(interface)类型上的自定义模型绑定(bind)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970672/

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