Показать представление в папке без контроллера или действия в ASP.net MVC - PullRequest
2 голосов
/ 04 декабря 2011

Я хотел бы отобразить представление в папке, если не найдено ни одного контроллера / действия.

Например, www.site.com/Home/Index, если у меня обычный маршрут по умолчанию {controller} / {action} / {id} тогда мне нужен HomeController с методом Index.В папке Views есть папка Home и файл Index.cshtml

. Если я попробую www.site.com/About/Index, мне нужно создать AboutController и индекс метода.Но у меня есть только папка About и файл Index.cshtml.

Мне бы хотелось, чтобы маршрут по умолчанию не совпадал, но у меня есть папка и файл в папке Views, которые соответствуют шаблону: {controller}является ли папка {action} видом;затем отображается это представление.

Как мне этого добиться?

Ответы [ 4 ]

4 голосов
/ 04 декабря 2011

Для пропущенных действий вы можете переопределить HandleUnknownAction .

Для отсутствующих контроллеров вы можете реализовать пользовательский DefaultControllerFactory и переопределить GetControllerInstance примерно так:

protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {

   if (controllerType == null)
      return new DumbController();

   return base.GetControllerInstance(requestContext, controllerType);
}

class DumbController : Controller {

   protected override void HandleUnknownAction(string actionName) {

      try {
         View(actionName).ExecuteResult(this.ControllerContext);
      } catch (Exception ex) {
         throw new HttpException(404, "Not Found", ex);
      }
   }
}
2 голосов
/ 07 июня 2014

Недавно я столкнулся с той же проблемой при разработке веб-приложений AJAX, в которых большинству страниц фактически не нужен контроллер (все данные возвращаются через вызовы Web API).

Казалось неэффективным иметь десятки контроллеров с одним действием, возвращающим представление, поэтому я разработал плагин ControllerLess , который включает контроллер представления по умолчанию за кулисами с одним действием.

Если вы создадите контроллер для своего представления, MVC будет использовать его.Однако, если вы создаете представление без контроллера, запрос перенаправляется через подключаемый контроллер по умолчанию.

Он работает с C # и VB.NET и доступен для https://www.nuget.org/packages/ControllerLess

Исходный код также доступен на GitHub по адресу https://github.com/brentj73/ControllerLess

1 голос
/ 04 декабря 2011

Вы не можете и не должны, как хотите.Представления не могут быть обработаны проектно (в файле web.config в папке / views есть HttpNotFoundHandler, сопоставленный с * для обеспечения этого)

С учетом сказанного, то, что вы хотите здесь, не является действительно стандартным, так почему вы хотитечтобы сделать это, может быть, мы можем предложить лучшее предложение, основанное на причине этого?

0 голосов
/ 04 декабря 2011

Никогда не пробовал, но вот мысль. Вы можете установить ограничения для маршрутов, и, таким образом, вы сможете создать маршрут, соответствующий "{folder} / {file}", где вы ограничите их допустимыми значениями (вы можете Google это или найти ее в SO), и установить запустить его на FileController (произвольное имя) с некоторым действием по умолчанию. Затем в этом действии просто верните желаемый вид. Что-то вроде:

public class FileController : Controller {
    public ActionResult Default(string folder, string file) {
        return View(folder + "/" + file);
    }
}
...