在MVC中,我想直接从视图上传递一个对象给action,可能我描述的不是很清楚,直接看代码吧。
View:
@{ Layout = null; Student stu= new Student () { Name = "传递对象" }; }
<form action="/Book/Send" method="POST">
<input type="hidden" name="ids" value="@stu"/>
<input type="submit" value="提交"/>
</form>
Action:
public ActionResult Send(Object ids) { var pType= ids.GetType().Name; return View(); }
这个代码应该能表达出我想问的问题,大家帮忙看看吧,很急!
可能我还是没描述清楚我的问题吧,我想要的是通过这个对象得到他的类型,而不是简简单单的传递一个Model,我知道MVC通过name可以传递,但是这是在已知Model类型的情况下,而我现在的Model类型不确定,有很多个,可能是Student,也可能是其他的,能懂我意思吗?
三点了,大家不要睡午觉了,快来帮忙看看问题啊!
MVC我可能比你还菜鸟。
略微知道一点HTTP POST的事,我们跳出MVC情怀的外表,看看ACTION内部的实质是什么,如果微软不搞鬼的话,感觉你是拿不到对象TYPE的。
因为POST过去的数据其实是NAME/VALUE数组。
如果要能够得到对象的话,就说明POST过去的不是NAME/VALUE数组,
而是对象的序列化字符串或是XML字符串,这样才有可能通过反序列化得到对象。
而我感觉实际上应该是NAME/VALUE数组,再通过强制Column Mapping变成对象的。
(这个你要是不信的话,可以测试一下,顺便告诉我答案)
如果硬要我给建议的话,应该不是在这儿动脑筋,而是想办法修改编程结构或是数据模型。
嗯,我要的就是对象的类型,目前我能想到的就是传递类名称,然后根据反射得到类的对象。大叔有什么好的思路吗?
支持,直接把post的键值对让程序自动识别成强类型的对象,感觉思路有点问题
@晓菜鸟: 这样的做法或许可以实现,但是感觉写法有点偏呢。不过具体的还要看你的实际情况了,仔细分辨一下变化点到底在哪里。一般在model或者数据访问层公用的情况多,在view层公用的情况比较少吧
@晓菜鸟: 土方法其实随便想都有一大翔的...不过MVC的优雅一定是没有了。
如果不需要优雅的写代码的话,你一定也可以想到好多办法的...
你想想应该会知道的,不需要我来多嘴吧。
@小静(Cathy): 支持,直接把post的键值对让程序自动识别成强类型的对象
不知道你说的是什么意思,能否说得具体点呢?
@晓菜鸟: 看下 “爱编程的大叔”那段回复
@小静(Cathy): 你的意思也是得不到吗?
怎么不用MVC中的ModelBinding写法呢
如果有ModelBinding的话,那么我应该怎么构造呢?
@晓菜鸟:
controller: public ActionResult Test() { return View(); } [HttpPost] public ActionResult Test(Student student) { return View(); } view: @{ Layout = null; Student stu= new Student () { Name = "传递对象" }; } <form action="@Url.Action("Test")" method="POST"> <input type="hidden" name="student.Name" value="@stu.Name"/> <input type="submit" value="提交"/> </form>
@小静(Cathy): 我不知道我应该怎么描述这个问题,我想要的是通过这个对象得到他的类型,而不是简简单单的传递一个Model,我知道MVC通过name可以传递,但是这是在已知Model类型的情况下,而我现在的Model类型不确定,可能是Student,也可能是其他的,有很多个,能懂我意思吗?所以我的参数类型给的是Object。
@晓菜鸟: 虽然不了解你的场景,但感觉你的做法挺稀罕的。你不知道什么类型,那打算怎么从view传过去呢?分别传name,id等,到action中让程序自己告诉你是什么类型吗?不知道我理解的是不是有偏差,c#是可强类型的。你可以考虑下泛型、反射等思路看能不能实现,或者整体转换一下思路看看。
@小静(Cathy): 具体的类型是从页面上传递过去的,这个方法很多地方调用,不同的页面传递不同的类型,我想的就是从页面上传递一个对象到action中,然后根据这个对象得到他的类型,进而进行后面的业务逻辑。
@晓菜鸟: 既然类型可以传过去,为什么还要用gettype呢,直接根据传递过来的类型名字实例化一个对象不就可以了吗。不过这样做感觉耦合性挺大的
@小静(Cathy): 我现在就是不知道怎么把具体的类型传递到action中。
看看基础教程吧。
我不知道我应该怎么描述这个问题,我想要的是通过这个对象得到他的类型,而不是简简单单的传递一个Model,我知道MVC通过name可以传递,但是这是在已知Model类型的情况下,而我现在的Model类型不确定,有很多个,能懂我意思吗?
@小静(Cathy): 你没看我给你的回复吗?我现在的Model类型是未知的,可能是Student,也可能是其他的,所以我的参数类型给的是Object。
视图是在调用view()方法的时候执行的.
你在view里修改全局的值,在View()调用后就能获取到了
翔哥,请原谅我不太明白.
@晓菜鸟: 我对你的问题误解了```
看了下大家说的``你需求是可以实现的,当时描述的时候完全脱离了请求响应模型,和HTTP协议``
你如果都不知道前台传过来的是什么类型你拿到值也是用不了的.
所以传到后台的值中必然得有1个类型标识,用来说明传到后台的是哪个类的对象,
知道是哪个类了.问题自然也就解决了..明白意思不?
@吴瑞祥: 你的意思是不是传递一个参数,用来表示对象类型,比如cType="stu"则表示student类,是这个意思吧?但是如果是这样的话,很多类的话就得全部自己手写了,我一开始的想法就是传递一个对象或者对象的类型过来,然后直接操作就行了。但是现在得不到。
@晓菜鸟: 不可能的,你如果不知道类型,计算你获取到对象了也是没有意义的,因为你不知道他里面有什么,
使用一个对象的前提就是你知道他的类型
@吴瑞祥: 我目前不需要知道他里面有什么,只要能得到类型就行。
@吴瑞祥: 有没有好的思路?
@晓菜鸟: <input type="hidden" name="ids" value="@stu.GetType().FullName"/>
@吴瑞祥: 我目前得到的就是这个.
@晓菜鸟: 那你要的是什么?
@吴瑞祥: 额,这个得到的是Model.GuaKao.Student. 我要的是得到这个对象或者这个对象的类型.
@晓菜鸟: 定义一个object引用.用他指向你你要的任意对象.
object obj=str;
<input type="hidden" name="ids" value="obj.GetType().FullName"/>
@吴瑞祥: 这个东西传到action里面也不是对象或者类型啊,就是一个字符串。
@晓菜鸟: 这个字符串不就是类型了````至于对象就得先序列化成JSON放在页面上,提交到后台之后再反序列化
@吴瑞祥: 我没法拿这个字符串的类型直接new对象啊。
@晓菜鸟: 你需要补一下反射的知识了,到园子里搜下反射的用法.有那个字符串后,是可以获取到对象实例的
@吴瑞祥: 我擦,我就是用的反射,你看我跟大叔的对话,但是现在报错了,老是说找不到这个dll。
@晓菜鸟: 那现在的问题就是反射的使用方法的问题了.你再把你反射的代码贴一下吧
@吴瑞祥: 是不是我的地址给错了?
string path = "Model.GuaKao.BookResult"; string typeName = "BookResult"; var acc= Assembly.Load(path).CreateInstance(typeName);
@晓菜鸟: ······确实是错的,不用load直接获取当前程序集,看看
你真得学习下怎么用反射了
@吴瑞祥: 哥,具体点。
@晓菜鸟: 你觉得什么是PATH,什么是TYPE,我怎么觉得你写反了?
Path是DLL的文件路径,Type必须得是包含Namespace的类的全称啊。
@爱编程的大叔: 嗯,谢谢大叔,这个问题前几天我已经搞好了的。但是@幻天芒大哥说可以用自定义ModelBinder来实现,我暂时没思路。
咦?这样传不进去吗?我搜索的都是这么用的阿。dymic试试匿名大吧
???没明白你的意思。dymic试试匿名大吧???
一个字符串参数,json格式的, action 里 进行反序列化对应的对象。怎么区分对象,可以加参数识别。
额,那我怎么知道我反序列化成什么类型的呢?
@晓菜鸟: 加其它参数区分,客户端再传一个参数,总归要有一个 约定吧。
@Qlin: 我大概明白了,您的意思是还是需要类似 cType="stu" 这样的代码来表示具体是那个类对吧?
@晓菜鸟: 是的,要不然 怎么知道具体的类型....
@Qlin: 嗯,我一开始的想法是看视图能不能直接传递对象或者对象的类型到action中,但是貌似不行。
标准mvc不支持这种传递方式。不过你可以采用自定义ModelBinder来实现类似的功能。
您的意思是说是可以实现传递一个对象到action的对吧?
@晓菜鸟: 理论上可行。没具体实现过~
@幻天芒: 好吧,谢谢了,有时间了试试。
@晓菜鸟: 有时间一定试试,现在手上有任务,呵呵。
@幻天芒: 嗯,我是说我自己,等做完手头上的活有时间试试,当然大神您也可以试试。:)
@晓菜鸟:
实现: class ObjectModelBinder: IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { return new TEst {Name="test"}; } } 调用: public ActionResult Index([ModelBinder(typeof(ObjectModelBinder))]object t) { var tModel = t as TEst; ... }
@幻天芒: 这样我从页面上应该怎么写呢?像我这样写可以吗?
<input type="hidden" name="ids" value="@stu"/>
@晓菜鸟: 随便了,反正http请求,是把name当成key,把value做值。
@幻天芒: 嗯,谢谢分享,我去试试。
@幻天芒: 大哥,你这个代码是实现什么的?小弟愚昧,我感觉我用错了。
@晓菜鸟: 其实我不建议你用object来做参数,这个代码说明都没实现,只是说能用对object进行数据绑定而已。
@幻天芒: 嗯,这点我理会到了,那大哥有没有什么好一点的建议?
@晓菜鸟: ViewModel,可以结合AutoMapper来实现ViewModel<->DTO的转换。
@幻天芒: 说实话,没用过,不过这也给了我一个研究的方向,谢谢了!