2010-07-26 2 views
0

У меня есть сценарий, где мне нужна следующая функциональность:вызова действия другого контроллера и возвращает результат для просмотра

In View I have call as: 
$.ajax({ 
    type: "POST", 
    async: false, 
    dataType: 'json', 
    url: "ControllerA/ActionA", 
    data: { var1: some_value }, 
    success: function (data) { 
     if (data == true) { 
      form.submit(); 
     } 
     else if (data == false) { 
    } 
}); 

// In ControllerA 
public JsonResult ActionA(string var1) 
{ 
    /* 
Some manipulation and calculations 
*/ 
_slist = RedirectToAction("ActionC", "ControllerB", new { var1 = some_value}); 
string = _slist.First().ToString(); 

    return RedirectToAction("ActionB", "ControllerB", new { var1 = var2 }); 
} 

// In ControllerB 
public JsonResult ActionB(string var1) 
{ 
    /* 
Some manipulation and calculations 
*/ 

    return Json(false, JsonRequestBehavior.AllowGet); 
} 

public SelectList ActionC(string var1) 
{  
/* 
Some manipulation and calculations 
*/ 

Session["STRING"] = some_value; 

return new SelectList(_storeOrderTimeDictionaryList, "Value", "Key"); 
} 

Мне нужно JsonResult в View Page, но проблемы, как:

  1. Как RedirectToAction возвращает redirecttorouteresult Я не могу напрямую вернуть JSonResut
  2. Поскольку мне нужен сеанс в ActionC, я не могу создать экземпляр контроллера и вызывать действие.
+0

Какая архитектура на стороне сервера вы используете? Отметьте его тем, что есть, и вы с большей вероятностью привлечете людей, которые могут вам помочь. –

ответ

1

Это может быть не лучший подход ...

Его трудно сказать, но высыхание контроллеры и перемещение из бизнес-логики может помочь. Похоже, что вы хотите сохранить функциональность Actions B и C.

$.ajax({ 
    type: "POST", 
    async: false, 
    dataType: 'json', 
    url: "ControllerA/ActionA", 
    data: { var1: some_value }, 
    success: function (data) { 
     if (data == true) { 
      form.submit(); 
     } 
     else if (data == false) { 
    } 
}); 


public Class CalculationsA 
{ 
    public void DoCalculation() {} 
} 

public Class CalculationsB 
{ 
    public void DoCalculation() {} 
} 

public Class CalculationsC 
{ 
    public IQueryable<somethign> DoCalculation() {} 
} 


//_a is declared in Controller A as CalculationsA 
//_b is declared in Controller B as CalculationsB 
//_c is declared in Controller C as CalculationsC 

// In ControllerA 
public JsonResult ActionA(string var1) 
{ 
    _a.DoCalculation(); 
    _slist = _b.DoCalculation().First().ToString(); 

    Session["STRING"] = some_value; 
    _c.DoCalculation();   

    /* your other logic... */ 

    return Json(retval, JsonRequestBehavior.AllowGet); 
} 

// In ControllerB 
public JsonResult ActionB(string var1) 
{ 
    _b.DoCalculation(); 

    return Json(false, JsonRequestBehavior.AllowGet); 
} 

public SelectList ActionC(string var1) 
{  
_c.DoCalculation(); 

Session["STRING"] = some_value; 

return new SelectList(_storeOrderTimeDictionaryList, "Value", "Key"); 
} 

Кстати, вы должны проверить Ninject, Виндзорский замок, структура Карта, или любой другой контейнер DI/МОК, чтобы помочь вам проверить это логики (и сделать его сушилкой). Попробуйте найти ninject asp.net mvc 2 tutorial

0

Не можете ли вы реорганизовать действия контроллера для извлечения Some manipulation and calculations в другой вызов класса или вызова уровня обслуживания.

Как мне нужен сеанс в ActionC Я не могу создать экземпляр контроллера и вызвать действие.

Ничего не мешает вам использовать сеанс в ControllerA.ActionA. Ниже не является точным, но может помочь вам ..

public class ControllerA{ 
    public JsonResult ActionA(string var1) 
    { 
    /* Some manipulation and calculations */ 
     SomeService service = new SomeService(); 
     _slist = service.ActionThatDoesStuffForActionC(var1); 
     Session["STRING"] = var1; 
     var firstItem = _slist.First().ToString(); 

     SomeOtherService service2 = new SomeOtherService(); 
     var service2Result = service2.ActionThatDoesStuffForActionB(firstItem); 

     // convert service2Result to a jsonresult here. 

     return RedirectToAction("ActionB", "ControllerB", new { var1 = firstItem }); 
    } 
} 

public class ControllerB{ 
    public JsonResult ActionB(string var1) 
    { 
      /* Some manipulation and calculations */ 
      SomeOtherService service2 = new SomeOtherService(); 
      var service2Result = service2.ActionThatDoesStuffForActionB(var1); 

      return Json(false, JsonRequestBehavior.AllowGet); 
    } 

    public SelectList ActionC(string var1) 
    {  
    /*  Some manipulation and calculations  */ 
    SomeService service = new SomeService(); 
    _slist = service.ActionThatDoesStuffInActionC(var1); 
    Session["STRING"] = var1; 
    return new SelectList(_slist, "Value", "Key"); 
    } 
} 

Edit: Посмотрите на исходный код отсюда http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/07/23/mvcconf-slides-and-code-posted.aspx. Я думаю, что подход Джимми Боггарда может быть полезным и предоставить вам способ вызвать действия «другого контроллера». Вы комментируете: «Я не могу изменить поведение действия. И для рефакторинга потребуется время, которого у меня нет ». для меня означает путешествие по дороге к неподъемному коду. Refactor, Refactor, Refactor - преимущества этого теперь помогут сэкономить вам часы сердечной боли на более позднем этапе. И, основываясь на этом вопросе, я думаю, что он уже начался.

+0

Я перечислил только некоторые из действий. Но в каждом контроллере есть около 20 действий. Большинство этих действий взаимосвязаны. Поскольку это приложение уже работает, я не могу изменить поведение действия. И для рефакторинга потребуется время, которого у меня нет. Поэтому я не могу создать другой класс, например Utilities, и написать методы, которые могут использоваться в actiion. я должен вызвать действие. Так или иначе, я могу достичь своей цели? –

+0

@ SP249- «Связанные действия», «невозможно изменить», «уже жить» - быть тупым, ваше приложение звучит как мальчик-плакат анти-ТВЕРДОЙ. Другой аспект заключается в том, что вы упоминаете, что вы не можете изменить поведение действий, но вы просите решение, которое потребует изменения в живой системе и вашей кодовой базе. Предоставленное решение не изменяет поведение действия (-ов), а предоставляет вам способ сделать ваше приложение более удобным для обслуживания, инкапсулируя поведение таким образом, что его можно повторно использовать в рамках всего вашего приложения. Ставки на взаимозависимости контроллеры будут уменьшаться. – Ahmad

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