2011-12-14 5 views
0

Можно ли передать объект в контроллер? Например, у меня есть ActionLink, и я передаю модель как идентификатор.Возможно ли передать объект через ActionLink

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

И контроллер имеет

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

Как я могу это сделать? Это глупо?

ответ

2

Нет, вы не можете передавать такие объекты. Помощник ActionLink генерирует якорный тег, который при нажатии отправляет на сервер запрос GET. В этом запросе GET вам нужно будет включить все, что вы хотите, чтобы сервер получал как часть строки запроса.

Другая возможность состоит в том, чтобы отправлять только идентификатор этой модели, так что действие контроллера может принести его обратно из хранилища, из которого она изначально извлекаться его при отображении страницы:

@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

У меня возникает соблазн -1, потому что ... false ... вы можете передавать объекты таким образом ... Вам нужно будет сериализоваться в JSON и десериализоваться с помощью настраиваемого связующего, но это возможно. –

+0

В принципе, я согласен, что он должен извлекать объект по id, но что «Нет» в первой части меня задевает ... –

+0

@JohnGietzen, конечно, но зачем сериализовать и десериализовать то, что у вас уже есть на сервере? –

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» для поиска.

Смежные вопросы