日期:2014-05-17  浏览次数:21030 次

MVC view执行 action 参数问题! 忘解惑
==
版主提示:请文明用语,谢谢!
==

第一次做MVC的项目,可能有些原理我是不了解的,才感觉 特别别扭。 遇到这样一个问题。
简单滴问: view 可以把一个 强类型对象 例如Model 或者 自定义集合 作为参数,来调用 controller的action吗?

详细滴问:


controller class
{
  actionresult A(){}
  actionresult B(Object _parameters){}
}
有一个View pagelist.aspx

在 action A 是页面pagelist.aspx 的初始化 动作, 在页面上 有一个按钮 通过
Ajax.ActionLink("***",B, new {Model.SourceList },
  new AjaxOptions
  {
  UpdateTargetId = Model.ReplaceDivId,
  InsertionMode = InsertionMode.Replace,
  HttpMethod = "Get"
  })%>
去 执行动作 B, 效果是 传不回来强类型的对象SourceList, 默认成了一个字符串.
目前用 TempData 来解决了, 不解其中原因,难道view 就不能向Controller 传递自定义的数据集或者model 实体吗?

在 A() 中setdate: TempData["key"]=sourcelist; 在B 中 可以使用,不过搞笑的是,如果 B中如果不再次给TempData 赋值的话,页面再此 执行 actionB 的时候 TempData 里的值为null. 
所以在 actionB zhong代码不得不写成
firt getdate:var source=TempDate["key"] as ...type.
second setdate: Tempdate["key"]=source.

兄弟实在是 哭笑不得(实在不愿意用此方案)。 刚接触MVC,也许是我还没理解原理,也许是我用法不对, 希望各位解惑。



此问题 是在我 封装一个 分页控件的时候,遇到特定业务时出现的,基本业务能满足,但是 遇到一个页面 有 多个tab,每个tab 下 有几个列表 都需要分页, 而tab 的 css 是 客户定制的,不知如何去做tab change的操作,所以 被逼,我在初始化的时候,会 取出所有list的 iquerynable<>集合,通过自己 封装的 类 去skip 和take 相应的应用到封好的分页控件中. 由于取数据源的逻辑复杂 ,不便用一个简单参数传出,到分页的时候 再取。 所以只好 把 整个iquerynable作为参数 传出,然后view在分页的时候再把集合传回到一个单独的action中,再次处理。
原本 参数 string 类型的 一般都满足,为此才改成Object 类型,结果还没法用,擦。

真正接触mvc才2天,个人感觉 可能和 html ajax javascript 结合的比较好些,但多数都是 前端应用, server端给我的感觉 是在 不敢恭维. I don't bird it!

大虾解惑吧,或者 对 业务有什么更好的方案.


------解决方案--------------------
不管 是mvc还是 web form,
Ajax.ActionLink、Html.ActionLink(),a等 连接,单击的方法Url差数都是以字符串传值,
前台给后台传值,有传集合的吗?如json,后台都要处理相应的格式,都是以字符串的形式传递的。
要想 后台接受集合,可以把参数在后台序列化成对应的集合。
------解决方案--------------------
主要是因为你用的是get方式(你的代码里有一句 HttpMethod = "Get"),这样只能通过url传值,当然只能是简单的字符串了,应该用post方式.


在 A() 中setdate: TempData["key"]=sourcelist; 在B 中 可以使用,不过搞笑的是,如果 B中如果不再次给TempData 赋值的话,页面再此 执行 actionB 的时候 TempData 里的值为null.
====================
并不搞笑,就是这样的,你可以理解为TempData, ViewData都是“单向”传值的,即只能从服务端向客户端(页面)传,倒过来不行,它不是ViewState.
------解决方案--------------------
顶一下

------解决方案--------------------
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
------解决方案--------------------
jquery写的:
var currentForm = document.getElementById('currentForm');
$.ajax({
url:"/abc.mvc/myAction",
type: "POST",
data: $(currentForm).serialize(),//序列化整个表单
success: function(data) {
$("#mydiv").html(data);
}
);

服务端:
public ActionResult myAction(MyModel model)
{
string s = model.MyProperty;
...


如果这样不行,那么不用ajax,提交整个页面,肯定是可以的,这个已经被实践证实了。

------解决方案--------------------
帮顶~~~~~·