加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC将模型发布到具有接口的操作

发布时间:2020-12-16 07:04:21 所属栏目:asp.Net 来源:网络整理
导读:我的理解是ASP.NET MVC只允许您将对象POST到Controller中的Actions,其中Action的参数接受已发布的对象作为Concrete类. 有什么方法可以解决这个问题,还是一个不错的选择? 在我的例子中,我有一个接受接口作为参数的动作: public ActionResult SaveAdjustment
我的理解是ASP.NET MVC只允许您将对象POST到Controller中的Actions,其中Action的参数接受已发布的对象作为Concrete类.

有什么方法可以解决这个问题,还是一个不错的选择?

在我的例子中,我有一个接受接口作为参数的动作:

public ActionResult SaveAdjustment(IModel model)
{
    switch (model.SubsetType)
    {
        // factory like usage
    }
}

对于这个动作,我有很多视图,所有视图都强烈地输入到实现IModel的对象,我希望能够将这些视图发布到这个方法.

当然,运行这个给我错误:

Cannot create an instance of an interface

有一个很好的工作吗?或者我是否需要为每个创建一个Action方法并将它们发送到这样的方法?

解决方法

从Request.Form发布时,MVC通常会绑定模型,即名称=值对的集合.在默认实现中不支持绑定接口或抽象类的原因很明显 – mvc无法确定从name = value对创建哪个具体类.如果您在客户端获得了隐藏字段,或者您可以通过任何其他参数确定要创建哪种类型的具体类,则只需创建自定义模型绑定器即可.我相信你可以覆盖DefaultModelBinder的CreateModel方法并重用所有其他内置绑定功能

public class IModelModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext,ModelBindingContext bindingContext,System.Type modelType)
    {
        //Create and return concrete instance
    }
}

并在global.asax中模拟绑定器注册

ModelBinders.Binders.Add(typeof(IModel?),new IModelModelBinder());

实际上,mvc中的控制器和动作都很薄,某种服务层应该很厚.由于您尝试实施的操作逻辑很快就会变得复杂,我建议将其移至单独的服务中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读