c# – 将接口传递给ASP.NET MVC Controller Action方法

c# – 将接口传递给ASP.NET MVC Controller Action方法,第1张

概述在我的ASP.NET MVC应用程序中,我有一个接口,它充当几个不同视图模型的模板: public interface IMyViewModel{ Client Client1 { get; set; } Client Client2 { get; set; } Validator Validate();} 所以,我的视图模型定义如下: public interfac 在我的ASP.NET MVC应用程序中,我有一个接口,它充当几个不同视图模型的模板:
public interface IMyviewmodel{    ClIEnt ClIEnt1 { get; set; }    ClIEnt ClIEnt2 { get; set; }    ValIDator ValIDate();}

所以,我的视图模型定义如下:

public interface Myviewmodel1 : IMyviewmodel{    ClIEnt ClIEnt1 { get; set; }    ClIEnt ClIEnt2 { get; set; }    // PropertIEs specific to Myviewmodel1 here    public ValIDator ValIDate()    {        // Do viewmodel-specific valIDation here    }}public interface Myviewmodel2 : IMyviewmodel{    ClIEnt ClIEnt1 { get; set; }    ClIEnt ClIEnt2 { get; set; }    // PropertIEs specific to Myviewmodel2 here    public ValIDator ValIDate()    {        // Do viewmodel-specific valIDation here    }}

然后我当前有一个单独的控制器 *** 作来使用模型绑定对每个不同的类型进行验证:

[httpPost]public ActionResult Myviewmodel1ValIDator(Myviewmodel1 model){    var valIDator = model.ValIDate();    var output = from Error e in valIDator.Errors                 select new { FIEld = e.FIEldname,Message = e.Message };    return Json(output);}[httpPost]public ActionResult Myviewmodel2ValIDator(Myviewmodel2 model){    var valIDator = model.ValIDate();    var output = from Error e in valIDator.Errors                 select new { FIEld = e.FIEldname,Message = e.Message };    return Json(output);}

这很好 – 但如果我有30种不同的视图模型类型,那么就必须有30个单独的控制器动作,除了方法签名之外都有相同的代码,这似乎是不好的做法.

我的问题是,我如何整合这些验证 *** 作,以便我可以传递任何类型的视图模型并调用它的ValIDate()方法,而不关心它是哪种类型?

起初我尝试使用接口本身作为动作参数:

public ActionResult MyviewmodelValIDator(IMyviewmodel model)...

但这不起作用:我得到一个无法创建接口异常的实例.我以为模型的一个实例会传递给控制器​​动作,但显然事实并非如此.

我确定我错过了一些简单的事情.或许我刚才接近这一切都错了.谁能帮我吗?

解决方法 您无法使用该接口的原因是序列化.当请求进入时,它只包含表示对象的字符串键/值对:
"ClIEnt1.name" = "John""ClIEnt2.name" = "Susan"

当调用action方法时,MVC运行时会尝试创建值以填充方法的参数(通过称为模型绑定的过程).它使用参数的类型来推断如何创建它.正如您所注意到的,参数不能是接口或任何其他抽象类型,因为运行时无法创建它的实例.它需要一种具体的类型.

如果你想删除重复的代码,你可以编写一个帮助器:

[httpPost]         public ActionResult Myviewmodel1ValIDator(Myviewmodel1 model)         {             return ValIDateHelper(model);         }         [httpPost]         public ActionResult Myviewmodel2ValIDator(Myviewmodel2 model)         {             return ValIDateHelper(model);         }private ActionResult ValIDateHelper(IMyviewmodel model) {    var valIDator = model.ValIDate();             var output = from Error e in valIDator.Errors                          select new { FIEld = e.FIEldname,Message = e.Message };             return Json(output);}

但是,对于每种模型类型,您仍然需要不同的 *** 作方法.也许还有其他方法可以重构您的代码.似乎模型类的唯一区别是valIDataion行为.您可以在模型类中找到另一种编码验证类型的方法.

总结

以上是内存溢出为你收集整理的c# – 将接口传递给ASP.NET MVC Controller Action方法全部内容,希望文章能够帮你解决c# – 将接口传递给ASP.NET MVC Controller Action方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241711.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存