Конфигурация ASP MVP НЕ соглашение

Я понимаю многие преимущества соглашения по сравнению с конфигурационным подходом ASP MVC. Тем не менее, я хотел бы попытаться создать сайт на основе ASP MVC, используя подход, основанный на конфигурации, и с атрибутами маршрута.

По сути, я хотел бы, чтобы все мои контроллеры находились в корне проекта (не вложены ниже папки «Контроллеры»), а представления рядом с ним (не вложены ниже папки представлений).

например в корневой папке что-то вроде:

  • Posts.cs (контроллер) — будет иметь методы, которые будут сопоставляться с маршрутами через атрибуты.

  • Posts.cshtml (просмотр)

Я искал и удивительно нашел очень мало по теме.

Например, у меня есть следующий контроллер в моем корневом каталоге (more.cs)

public class More : Controller
{
    [Route("more")]
    public ActionResult Index()
    {
        return View("~/more.cshtml");
    }
}

И я вызываю это в RouteConfig.cs

routes.MapMvcAttributeRoutes();

Но генерирует ресурс не может быть найден ошибка

Опять же - я не ищу, ПОЧЕМУ я не хотел бы этого делать... я понимаю преимущества соглашения... но КАК я мог бы это сделать, если бы захотел (правильно или неправильно).


person frigon    schedule 01.04.2015    source источник
comment
Насколько я знаю, соглашение о маршрутизации не имеет ничего общего с расположением файла класса контроллера. /user/show/1 ищет метод show UserController и передает ему 1 в качестве аргумента.   -  person Tony Hopkinson    schedule 02.04.2015
comment
Эта статья может дать вам некоторые рекомендации о том, как настроить ViewEngine для поиска местоположений файлов.   -  person    schedule 02.04.2015


Ответы (1)


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

  1. Удалите соглашение об именах маршрутов. Самый простой способ сделать это — использовать маршрутизацию атрибутов в классе контроллера:

[RoutePrefix("mypath")] 
Public class AnyNameController : Controller{    
       [Route("prettyUrlName/{parameter}")]
       public ActionResult somefunction(string parameter){    
             ///do stuff
       }
    }

Чтобы это работало, вам нужно вызвать следующее при запуске веб-приложения:

RouteTable.Routes.MapMvcAttributeRoutes(); 2. To move any view out of the Views folder requires that you copy the Web.config settings that are in the Views folder to whereever folder you want to put the the *.cshtml view files (e.g. root)

   <configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="us.communion.www" />
  </namespaces>
</pages>

  1. Чтобы удалить соглашение об именах «* Controller», требуется создать собственную фабрику контроллеров. Об этом есть еще одна ветка: соглашение об изменении имени контроллера в ASP.NET MVC
person frigon    schedule 06.04.2015