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方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)