2009-11-23 2 views
0

Мне нужно вернуть различные результаты JSON клиенту из моих действий с контроллером. Я создал статические «вспомогательные» методы типа ContentResult. Я хочу, чтобы иметь возможность повторно использовать этих помощников в нескольких проектах, поэтому я создал их в своем классе, и когда-нибудь скоро я переведу их на свою собственную сборку.ASP.NET MVC Result Return Helper

Вот мой вопрос: некоторым из этих возвратных помощников нужен доступ к контексту контроллера, поэтому я создаю его как методы расширения на контроллере. Мне нравится, как методы Html Helper - это методы расширения класса HtmlHelper, но я не могу найти подходящее свойство контроллера, аналогичное свойству Html в классе View, поэтому я просто расширил контроллер. Ниже приведен код из возвращаемого помощника. Я хочу знать, есть ли лучший способ сделать это.

public static ContentResult AJAXRedirect(this Controller cont, string action, 
     string controller, object routeValues) 
    { 
     string url = cont.Url.Action(action, controller, routeValues); 
     string json = "{{\"redirect\": \"{0}\" }}"; 
     json = string.Format(json, url); 
     return new ContentResult 
     { 
      Content = json, 
      ContentType = "text/x-json", 
      ContentEncoding = Encoding.UTF8 
     }; 
    } 
+5

Использование JsonResult вместо ContentResult –

ответ

2

Вы можете использовать этот код:

string url = cont.Url.Action(action, controller, routeValues); 
return Json(new { redirect : url }); 

Расширение контроллера, кажется, хороший способ. Способы Content(), View(), Json(), Empty() также являются расширениями контроллера. Вы добавляете свои собственные.

EDIT

К сожалению, я был на самом деле не так о методах расширения. Они не являются методами расширения. Поэтому было бы лучше, если бы вы использовали свой собственный базовый класс Controller с дополнительными методами. Поскольку вы будете использовать эти методы внутри своих классов, наследование - лучшее решение. вы все равно можете делиться этим классом между проектами.

+0

Если они являются расширениями на контроллере, а мой тоже, то почему я должен вызывать мои вроде: this.AJAXRedirect(), но мне не нужно использовать это для других? –

+0

@LukLed, у меня есть класс базового контроллера, однако многие детали, связанные с проектом, попадают в него, поэтому нецелесообразно делиться ими между проектами. Я, хотя я где-то читал об официальном способе получения помощников по результатам, но я не могу найти его сейчас. –

+1

@ Джош Пирс: Вам не нужно использовать один класс базового контроллера. Вы можете создать один для каждого проекта, наследовать его и иметь другой, независимый, для конкретного проекта. – LukLed