ASP.NET 2.0的最小MVC设置

时间:2009-11-04 08:07:23

标签: c# model-view-controller asp.net-2.0

我必须将使用ASP.NET MVC创建的Web应用程序迁移到基于Visual Studio 2005 ASP.NET Web Forms的常规网站。

我看过像MonoRail这样的东西,但对于我的同事(已经对MVC感到不舒服)使用它的方式却太不相同了。

我读过ASP.NET MVC的第一个版本是在飞机飞行中制作的,这是我愿意处理的那种复杂性。

我不需要ORM。我有一个本土的ORM,我已经使用了很长时间,我将用它来取代实体框架。

具体来说,我主要是在寻找两件事:如何在web.config和一个花哨的Default.aspx中使用一行或两行进行路由,以及如何使用注入模型数据的aspx页面进行渲染。

4 个答案:

答案 0 :(得分:1)

您可以在ASP.NET中按照MVC进行路由。

在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>

答案 1 :(得分:0)

有关如何实现路由的指南,请参阅这些文章(尽管在web.config中只使用一行或两行进行此操作可能是一个崇高的目标):

为了注入模型数据 - 在后面的代码中检索所需的模型对象,并使用页面事件(Page_Load等)将数据插入控件,或将其绑定到可绑定控件。

答案 2 :(得分:0)

经过多次Google搜索后,我发现http://mudabone.com/?page_id=335几乎看起来就像我想要的那样,但源代码链接已被破坏。

答案 3 :(得分:0)

我能够从我之前提到的博客文章(A MVC Framework implementation in .Net 2.0 (Spanish))中获取代码并将其打成几乎无法使用的内容。

由于我根本不了解httpHandlers,我使用Intelligencia.UrlRewriter添加了一个hack。最后,我将以下内容添加到我的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扩展,但这也不起作用。

我发帖时仍有问题。让Alejandro的MainController正确处理多个post变量需要花费大量的工作,我可能不得不做一个FormCollection类。