首页 新闻 会员 周边

MVC,视图如何直接传递一个对象到action中?在线等,非常急.

0
[已解决问题] 解决于 2014-09-15 11:17

在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,也可能是其他的,能懂我意思吗?

三点了,大家不要睡午觉了,快来帮忙看看问题啊!

晓菜鸟的主页 晓菜鸟 | 老鸟四级 | 园豆:2594
提问于:2014-09-10 14:18
< >
分享
最佳答案
0

 

MVC我可能比你还菜鸟。

略微知道一点HTTP POST的事,我们跳出MVC情怀的外表,看看ACTION内部的实质是什么,如果微软不搞鬼的话,感觉你是拿不到对象TYPE的。

因为POST过去的数据其实是NAME/VALUE数组。

如果要能够得到对象的话,就说明POST过去的不是NAME/VALUE数组,

而是对象的序列化字符串或是XML字符串,这样才有可能通过反序列化得到对象。

而我感觉实际上应该是NAME/VALUE数组,再通过强制Column Mapping变成对象的。

(这个你要是不信的话,可以测试一下,顺便告诉我答案)

 

如果硬要我给建议的话,应该不是在这儿动脑筋,而是想办法修改编程结构或是数据模型。

 

奖励园豆:5
爱编程的大叔 | 高人七级 |园豆:30839 | 2014-09-10 15:34

嗯,我要的就是对象的类型,目前我能想到的就是传递类名称,然后根据反射得到类的对象。大叔有什么好的思路吗?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:36

支持,直接把post的键值对让程序自动识别成强类型的对象,感觉思路有点问题

敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 15:37

@晓菜鸟: 这样的做法或许可以实现,但是感觉写法有点偏呢。不过具体的还要看你的实际情况了,仔细分辨一下变化点到底在哪里。一般在model或者数据访问层公用的情况多,在view层公用的情况比较少吧

敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 15:43

@晓菜鸟: 土方法其实随便想都有一大翔的...不过MVC的优雅一定是没有了。

如果不需要优雅的写代码的话,你一定也可以想到好多办法的...

你想想应该会知道的,不需要我来多嘴吧。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-10 15:44

@小静(Cathy): 支持,直接把post的键值对让程序自动识别成强类型的对象

不知道你说的是什么意思,能否说得具体点呢?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:46

@晓菜鸟: 看下 “爱编程的大叔”那段回复

敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 15:49

@小静(Cathy): 你的意思也是得不到吗?

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:54
其他回答(7)
0

怎么不用MVC中的ModelBinding写法呢

敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 14:30

如果有ModelBinding的话,那么我应该怎么构造呢?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 14:36

@晓菜鸟: 

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>
支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 15:15

@小静(Cathy):  我不知道我应该怎么描述这个问题,我想要的是通过这个对象得到他的类型,而不是简简单单的传递一个Model,我知道MVC通过name可以传递,但是这是在已知Model类型的情况下,而我现在的Model类型不确定,可能是Student,也可能是其他的,有很多个,能懂我意思吗?所以我的参数类型给的是Object。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:18

@晓菜鸟: 虽然不了解你的场景,但感觉你的做法挺稀罕的。你不知道什么类型,那打算怎么从view传过去呢?分别传name,id等,到action中让程序自己告诉你是什么类型吗?不知道我理解的是不是有偏差,c#是可强类型的。你可以考虑下泛型、反射等思路看能不能实现,或者整体转换一下思路看看。

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 15:24

@小静(Cathy): 具体的类型是从页面上传递过去的,这个方法很多地方调用,不同的页面传递不同的类型,我想的就是从页面上传递一个对象到action中,然后根据这个对象得到他的类型,进而进行后面的业务逻辑。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:28

@晓菜鸟: 既然类型可以传过去,为什么还要用gettype呢,直接根据传递过来的类型名字实例化一个对象不就可以了吗。不过这样做感觉耦合性挺大的

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2014-09-10 15:30

@小静(Cathy): 我现在就是不知道怎么把具体的类型传递到action中。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:35
-1

看看基础教程吧。

Rookier | 园豆:652 (小虾三级) | 2014-09-10 15:05

我不知道我应该怎么描述这个问题,我想要的是通过这个对象得到他的类型,而不是简简单单的传递一个Model,我知道MVC通过name可以传递,但是这是在已知Model类型的情况下,而我现在的Model类型不确定,有很多个,能懂我意思吗?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:12

@小静(Cathy): 你没看我给你的回复吗?我现在的Model类型是未知的,可能是Student,也可能是其他的,所以我的参数类型给的是Object。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:15
0

视图是在调用view()方法的时候执行的.

你在view里修改全局的值,在View()调用后就能获取到了

吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 15:53

翔哥,请原谅我不太明白.

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 15:55

@晓菜鸟: 我对你的问题误解了```

看了下大家说的``你需求是可以实现的,当时描述的时候完全脱离了请求响应模型,和HTTP协议``

你如果都不知道前台传过来的是什么类型你拿到值也是用不了的.

所以传到后台的值中必然得有1个类型标识,用来说明传到后台的是哪个类的对象,

知道是哪个类了.问题自然也就解决了..明白意思不?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 16:00

@吴瑞祥: 你的意思是不是传递一个参数,用来表示对象类型,比如cType="stu"则表示student类,是这个意思吧?但是如果是这样的话,很多类的话就得全部自己手写了,我一开始的想法就是传递一个对象或者对象的类型过来,然后直接操作就行了。但是现在得不到。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 16:21

@晓菜鸟: 不可能的,你如果不知道类型,计算你获取到对象了也是没有意义的,因为你不知道他里面有什么,

使用一个对象的前提就是你知道他的类型

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 16:27

@吴瑞祥: 我目前不需要知道他里面有什么,只要能得到类型就行。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 16:32

@吴瑞祥: 有没有好的思路?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 16:49

@晓菜鸟: <input type="hidden" name="ids" value="@stu.GetType().FullName"/>

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 16:52

@吴瑞祥: 我目前得到的就是这个.

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 16:54

@晓菜鸟: 那你要的是什么?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 17:22

@吴瑞祥: 额,这个得到的是Model.GuaKao.Student.  我要的是得到这个对象或者这个对象的类型.

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 17:23

@晓菜鸟: 定义一个object引用.用他指向你你要的任意对象.

object obj=str;

 <input type="hidden" name="ids" value="obj.GetType().FullName"/>

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 17:34

@吴瑞祥: 这个东西传到action里面也不是对象或者类型啊,就是一个字符串。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 17:36

@晓菜鸟: 这个字符串不就是类型了````至于对象就得先序列化成JSON放在页面上,提交到后台之后再反序列化

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 17:38

@吴瑞祥: 我没法拿这个字符串的类型直接new对象啊。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 17:43

@晓菜鸟: 你需要补一下反射的知识了,到园子里搜下反射的用法.有那个字符串后,是可以获取到对象实例的

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 17:46

@吴瑞祥: 我擦,我就是用的反射,你看我跟大叔的对话,但是现在报错了,老是说找不到这个dll。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 18:13

@晓菜鸟: 那现在的问题就是反射的使用方法的问题了.你再把你反射的代码贴一下吧

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 18:33

@吴瑞祥: 是不是我的地址给错了?

 string path = "Model.GuaKao.BookResult";
 string typeName = "BookResult";
 var acc= Assembly.Load(path).CreateInstance(typeName);
支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 18:46

@晓菜鸟: ······确实是错的,不用load直接获取当前程序集,看看

你真得学习下怎么用反射了

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 18:49

@吴瑞祥: 哥,具体点。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 18:53

@晓菜鸟: 你觉得什么是PATH,什么是TYPE,我怎么觉得你写反了?

Path是DLL的文件路径,Type必须得是包含Namespace的类的全称啊。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-09-12 10:01

@爱编程的大叔: 嗯,谢谢大叔,这个问题前几天我已经搞好了的。但是@幻天芒大哥说可以用自定义ModelBinder来实现,我暂时没思路。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-12 10:06
0

咦?这样传不进去吗?我搜索的都是这么用的阿。dymic试试匿名大吧

大楚打码人 | 园豆:4313 (老鸟四级) | 2014-09-10 17:49

???没明白你的意思。dymic试试匿名大吧???

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 18:12
0

一个字符串参数,json格式的,   action 里  进行反序列化对应的对象。怎么区分对象,可以加参数识别。

Qlin | 园豆:2403 (老鸟四级) | 2014-09-10 18:56

额,那我怎么知道我反序列化成什么类型的呢?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 18:57

@晓菜鸟: 加其它参数区分,客户端再传一个参数,总归要有一个 约定吧。

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2014-09-10 18:59

@Qlin: 我大概明白了,您的意思是还是需要类似 cType="stu" 这样的代码来表示具体是那个类对吧?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 19:02

@晓菜鸟: 是的,要不然 怎么知道具体的类型....

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2014-09-10 19:03

@Qlin: 嗯,我一开始的想法是看视图能不能直接传递对象或者对象的类型到action中,但是貌似不行。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-10 19:05
1

标准mvc不支持这种传递方式。不过你可以采用自定义ModelBinder来实现类似的功能。

幻天芒 | 园豆:37175 (高人七级) | 2014-09-11 21:42

您的意思是说是可以实现传递一个对象到action的对吧?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-12 09:33

@晓菜鸟: 理论上可行。没具体实现过~

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-12 15:03

@幻天芒: 好吧,谢谢了,有时间了试试。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-12 15:06

@晓菜鸟: 有时间一定试试,现在手上有任务,呵呵。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-12 15:06

@幻天芒: 嗯,我是说我自己,等做完手头上的活有时间试试,当然大神您也可以试试。:)

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-12 15:07

@晓菜鸟: 

 

实现:
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;
...
}
支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-12 17:32

@幻天芒: 这样我从页面上应该怎么写呢?像我这样写可以吗?

<input type="hidden" name="ids" value="@stu"/>

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-12 18:08

@晓菜鸟: 随便了,反正http请求,是把name当成key,把value做值。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-12 22:50

@幻天芒: 嗯,谢谢分享,我去试试。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-13 09:36

@幻天芒: 大哥,你这个代码是实现什么的?小弟愚昧,我感觉我用错了。

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-13 10:43

@晓菜鸟: 其实我不建议你用object来做参数,这个代码说明都没实现,只是说能用对object进行数据绑定而已。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-13 15:56

@幻天芒: 嗯,这点我理会到了,那大哥有没有什么好一点的建议?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-13 15:57

@晓菜鸟: ViewModel,可以结合AutoMapper来实现ViewModel<->DTO的转换。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-09-13 16:14

@幻天芒: 说实话,没用过,不过这也给了我一个研究的方向,谢谢了!

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-13 16:16
0

问题解决了,谢谢大家了,换了一种方式,不过根据大家的回复我也学到了很多,特别感谢 爱编程的大叔吴瑞祥和 幻天芒三位大哥的帮助,谢谢了! 

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-09-15 11:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册