是否可以通过ActionLink传递对象

时间:2011-12-14 06:47:56

标签: asp.net-mvc asp.net-mvc-3 razor

是否可以将对象传递给Controller?例如,我有ActionLink,我将模型作为Id传递。

@Ajax.ActionLink(
            "Next", 
            "Step",
            new { StepId = 2, id = Model }, 
            new AjaxOptions { UpdateTargetId = "stepContainer" }, 
            new { @class = "button" })

控制器已

public ActionResult Step(int StepId, object id)
{
}

我该怎么做?这真傻吗?

2 个答案:

答案 0 :(得分:2)

不,你不能传递这样的对象。 ActionLink帮助程序生成一个锚标记,单击该标记时会向服务器发送GET请求。在此GET请求中,您必须包含您希望服务器作为查询字符串的一部分接收的所有内容。

另一种可能性是只发送此模型的id,以便控制器操作可以在呈现页面时从最初获取它的数据存储区中取回它:

@Ajax.ActionLink(
    "Next", 
    "Step",
    new { 
        StepId = 2,
        id = Model.Id
    }, 
    new AjaxOptions { UpdateTargetId = "stepContainer" }, 
    new { @class = "button" }
)

并在控制器操作中:

public ActionResult Step(int StepId, int id)
{
    var model = Repository.GetModel(id);
    ...
}

答案 1 :(得分:2)

您可以使用自定义模型绑定来执行此操作。

这是一个比StackOverflow可以实际覆盖的答案稍微大一点的主题,但你当然可以做到。

你会做这样的事情:

public class CrazyPantsModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        // Add code here to deserialize your object from the query string...

        return yourObject;
    }
}

您可以通过以下调用在Global.asax中注册它:

ModelBinders.Binders[typeof(object)] = new CrazyPantsModelBinder();

但是,我必须回答这个问题,是的,这有些愚蠢。

如果您正在寻找一些google-mojo以了解如何执行此操作,我会使用术语“json model binder”进行搜索。