Минимальная настройка MVC для ASP.NET 2.0

Мне нужно перенести веб-приложение, созданное с помощью ASP.NET MVC, на обычный веб-сайт на основе Visual Studio 2005 ASP.NET Web Forms.

Я рассматривал такие вещи, как MonoRail, но он слишком отличается для моих коллег (которым уже неудобно с MVC).

Я читал, что первая версия ASP.NET MVC была сделана в полете на самолете, и это примерно та сложность, с которой я готов иметь дело.

Мне не нужен ОРМ. У меня есть собственная ORM, которую я использую в течение длительного времени, и которую я буду использовать для замены Entity Framework.

В частности, я в основном ищу две вещи: как создавать маршруты, используя одну или две строки в web.config и причудливый Default.aspx, и как отображать страницу aspx с введенными в нее данными модели.


person wm_eddie    schedule 04.11.2009    source источник


Ответы (4)


Вы можете маршрутизировать согласно MVC в ASP.NET.

В global.asax:

protected void Application_Start(object sender, EventArgs e)
{
    //do stuff
    RegisterRoutes(RouteTable.Routes);
    //do stuff
?

public static void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = true;

        routes.Add(new Route("{controller}/{action}",
           new RouteValueDictionary { { "controller", "user" }, { "action", "home" } },
           new RouteValueDictionary { { "controller", @"^(?!Resources)\w*$" }, { "action", "[a-zA-Z]+" } },// means that .htm path will go straight to the file, not thru our router
           new MvcRouteHandler()));
}

Создайте свой собственный обработчик маршрута

public class CustomRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        //do stuff
        string controller = RequestContext.RouteData.Values["controller"].ToString();
        string methodName =  RequestContext.RouteData.Values["action"].ToString();
        //do stuff
    }

}

public class RoutingHandler : UrlRoutingHandler
{
     protected override void VerifyAndProcessRequest(IHttpHandler httpHandler, HttpContextBase httpContext)
    {
    }
}

Для web.config:

<httpHandlers>
    <remove verb="*" path="*.asmx" />
    <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false" />
    ***<add verb="*" path="UrlRouting.axd" validate="false" type="CustomHttpHandlerNamespaceAndClassName, CustomHttpHandlerNamespace" />***
</httpHandlers>
<httpModules>
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpModules>
person Mike    schedule 04.11.2009
comment
К сожалению, модуль маршрутизации является частью .Net Framework 3.5. - person wm_eddie; 05.11.2009

См. в этих статьях руководства по реализации маршрутизации (хотя выполнение всего одной или двух строк в файле web.config может быть благородной целью):

Для внедрения данных вашей модели - в коде извлеките объект модели, который вы хотите, и используйте события страницы (Page_Load и т. д.), чтобы вставить данные в элементы управления или привязать их к привязываемым элементам управления.

person Yaakov Ellis    schedule 04.11.2009

После долгих поисков в Google я нашел http://mudabone.com/?page_id=335, который довольно многое выглядит именно так, как я хочу, но ссылка на исходный код не работает.

person wm_eddie    schedule 04.11.2009
comment
Наконец-то нашел то, что не соответствует 404 alejandroidalquiroga.blogspot.com. - person wm_eddie; 04.11.2009

Мне удалось взять код из сообщения в блоге, о котором я упоминал ранее (реализация MVC Framework в .Net 2.0 (испанский)) и превратили его во что-то едва пригодное для использования.

Поскольку я вообще не понимаю httpHandlers, я добавил хак, используя Intelligencia.UrlRewriter. В конце концов я добавил следующее в свой web.config

    <httpModules>
  <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>
    <httpHandlers>
  <add verb="*" path="*.mvc"   type="MyApp.MainController"/>
        <remove verb="*" path="/MyApp/Views/*"/>
        <remove verb="*" path="/MyApp/Views/*/*"/>
        <remove verb="*" path="/MyApp/Content/*"/>
        <remove verb="*" path="/MyApp/Content/*/*"/>
        <remove verb="*" path="/MyApp/Scripts/*"/>
        <remove verb="*" path="/MyApp/Scripts/*/*"/>
    </httpHandlers>
</system.web>

Сделав это, мне пришлось добавить aspx в конец URL-адреса, например: /MyApp/Home/Index.aspx. Я пытался использовать расширение .mvc, но это тоже не сработало.

У меня все еще есть проблемы с публикацией, хотя. Потребуется немало работы, чтобы заставить MainController Алехандро правильно обрабатывать несколько пост-переменных, мне, вероятно, придется создать класс FormCollection.

person wm_eddie    schedule 09.11.2009