MVC中自定义方法如何接收Model类型参数

lovebaby 2015-10-15 12:15:07
比如我在VIEW中引用了一个Model,如下:
@model IEnumerable<hengcms_mvc.Models.mf_ModuleClass>

然后我自定义了一个方法
public string strclass(int ClassID,IEnumerable<mf_ModuleClass> list)
{
//code
}

调用时直接传入Model即可

ClassHelper category = new ClassHelper();
category.strclass(3,Model);

这没有任何问题,本身mf_ModuleClass类型是直接传入并按mf_ModuleClass接收的。

现在的问题是,我可能在不同的VIEW中有很多不同地的Model都要传入这个自定义方法(如:mf_ModuleClass,mf_ProductClass,mf_NewsClass等等),这些不同的Model只是类名不一样,成员都是一样的,但是在自定义方法中如何接收这个类型呢?

我目前的做法是先将mf_ModuleClass手工转换映射到一个通用类Category,然后在调用时将IEnumerable转成为IList泛型的Category,在自定义方法中接收这个IList<Category> list,不过总感觉绕了一步,有没有更直接的方法呢?
以下是我目前的方法:
View中转换:
@{
ClassHelper category = new ClassHelper();
IList<Category> List = new List<Category>();
foreach(var p in Model)
{
List.Add(new Category(){
ClassID = p.ClassID,
ClassName = p.ClassName,
ParentID = p.ParentID,
Depth = p.Depth,
Child = p.Child,
OrderID = p.OrderID,
Title = p.Title,
KeyWords = p.KeyWords,
Description = p.Description,
Content = p.Content,
ShowType = p.ShowType,
LinkUrl = p.LinkUrl,
Intro = p.Intro,
ClassPic = p.ClassPic,
ItemPic = p.ItemPic,
LanType = p.LanType,
IsHome = p.IsHome
});
}
category.strclass(3,List); //调用
}

方法中接收:
public string strclass(int ClassID,IList<Category> list)
{
return list.Count().ToString();
}
...全文
635 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_32081459 2015-10-17
  • 打赏
  • 举报
回复
如果是这样,那你的先忽略类型,直接传递成string,直接接收成json字符串。然后在接收一个type类型。后面代码根据type类型在去反序列成对应的IList<Type>
xboxeer 2015-10-16
  • 打赏
  • 举报
回复
引用 21 楼 xiaojie_cp 的回复:
[quote=引用 19 楼 xboxeer 的回复:] public string strclass(int ClassID,IEnumerable<mf_ModuleClass> list) { //code } 你把方法签名改成不就结了 泛型呀 public string strclass<T>(int ClassID,IEnumerable<T> list) { //code }
用你说的泛型,结合dynamic动态类型,可以有比之前更好的解决方案,至少从代码编辑量来说减少了,也不用在VIEW中写一堆类型转换代码了。
public string strclass<T>(int ClassID,IEnumerable<T> list)
        {
            dynamic c = list.First();
            return c.ClassName;
        }
目前为止,我认为这应该是一种最佳的解决方案。[/quote] mf_ModuleClass 如果你的model都有类似属性 那么你可以加个泛型限定 比如他们都继承自ICommon接口 你的className是一个公有属性 public string strclass<T>(int ClassID,IEnumerable<T> list) where T:ICommon { T c = list.First(); return c.ClassName; } dynamic我的感觉是尽量少用 我目前在项目组仅仅用dynamic实现LDAP返回回来的信息的封装
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
另外,根据这篇帖子得知我要把object通过反射转换成它本身实际代表的类型是不可能实现的。http://bbs.csdn.net/topics/390665986所以这种方法就应该放弃了。
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
引用 19 楼 xboxeer 的回复:
public string strclass(int ClassID,IEnumerable<mf_ModuleClass> list) { //code } 你把方法签名改成不就结了 泛型呀 public string strclass<T>(int ClassID,IEnumerable<T> list) { //code }
用你说的泛型,结合dynamic动态类型,可以有比之前更好的解决方案,至少从代码编辑量来说减少了,也不用在VIEW中写一堆类型转换代码了。
public string strclass<T>(int ClassID,IEnumerable<T> list)
        {
            dynamic c = list.First();
            return c.ClassName;
        }
目前为止,我认为这应该是一种最佳的解决方案。
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
引用 19 楼 xboxeer 的回复:
public string strclass(int ClassID,IEnumerable<mf_ModuleClass> list) { //code } 你把方法签名改成不就结了 泛型呀 public string strclass<T>(int ClassID,IEnumerable<T> list) { //code }
这样是可以传进来一个List,也可以取到值,但传进来的每一个T是一个object,我怎样使用这个object对应的实际类型的属性和方法呢?这个object怎样转成实际类型呢?
xboxeer 2015-10-15
  • 打赏
  • 举报
回复
public string strclass(int ClassID,IEnumerable<mf_ModuleClass> list) { //code } 你把方法签名改成不就结了 泛型呀 public string strclass<T>(int ClassID,IEnumerable<T> list) { //code }
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
我是要把这个object通过反射转换成它本身实际代表的类型,在网上找到的资料,大都是利用反射生成新的对象、调用对象方法等。
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
obj.GetType().ToString();
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
反射也行,但不太会用,呵呵。这个object怎么通过反射转换为对象本身,代码应该怎么写呢?
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
引用 14 楼 xiaojie_cp 的回复:
问题最终归结于这个object怎样利用反射转换为它本身所代表的类型的实体的问题,即利用反射转回对象本身。
是在不想反射,那你就在穿个参数过去,根据参数来判断转换的类型。
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
问题最终归结于这个object怎样利用反射转换为它本身所代表的类型的实体的问题,即利用反射转回对象本身。
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
object也可以,或者说更为直接。但传递到方法内部也会涉及到object转换类型的问题
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
引用 11 楼 xiaojie_cp 的回复:
[quote=引用 10 楼 正怒月神的回复:]ef更新倒是一个麻烦的事情。 那你看看,能不能设置成object 类型的参数,根据传过来的不同业务实体,在转换对象? 可能你还需要增加一个参数,来指明你这个对象的转换类型。
我想到了用dynamic传递,经测试证明也可以传递过去使用,但如何转换成我要的类型是个问题,用反射?不太会,呵呵[/quote] object,不能直接强转吗?
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
引用 10 楼 正怒月神的回复:
ef更新倒是一个麻烦的事情。 那你看看,能不能设置成object 类型的参数,根据传过来的不同业务实体,在转换对象? 可能你还需要增加一个参数,来指明你这个对象的转换类型。
我想到了用dynamic传递,经测试证明也可以传递过去使用,但如何转换成我要的类型是个问题,用反射?不太会,呵呵
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
ef更新倒是一个麻烦的事情。 那你看看,能不能设置成object 类型的参数,根据传过来的不同业务实体,在转换对象? 可能你还需要增加一个参数,来指明你这个对象的转换类型。
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
引用 8 楼 正怒月神的回复:
既然数据的属性一样,那么我觉得你可以这么做。 比如 a,b,c三个实体类 b和c都继承 a就可以了 然后 自定义方法的参数 就写a类型的。 最后submit提交后,转换成不同的对象。不知道可不可行,我只是觉得可以
你说的我也想到了,关键是你说的b和c都是基于dbfirst模式的edmx自动生成的,我如果从数据库更新了模型,岂不意味着我b类和c类的继承代码都要重加一遍?
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
既然数据的属性一样,那么我觉得你可以这么做。 比如 a,b,c三个实体类 b和c都继承 a就可以了 然后 自定义方法的参数 就写a类型的。 最后submit提交后,转换成不同的对象。不知道可不可行,我只是觉得可以
正怒月神 版主 2015-10-15
  • 打赏
  • 举报
回复
你的两个转回对象有主外键关系吗?
lovebaby 2015-10-15
  • 打赏
  • 举报
回复
引用 4 楼 wanghui0380 的回复:
如果是这样,那你的先忽略类型,直接传递成string,直接接收成json字符串。然后在接收一个type类型。后面代码根据type类型在去反序列成对应的IList<Type>
那我就要把Model中的数据转换成json格式的字符串,然后在方法中再把json格式的字符串转成List了
wanghui0380 2015-10-15
  • 打赏
  • 举报
回复
如果是这样,那你的先忽略类型,直接传递成string,直接接收成json字符串。然后在接收一个type类型。后面代码根据type类型在去反序列成对应的IList<Type>
加载更多回复(4)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧