23

Python フレームワークは常に、リクエストのデータを洗練された方法で伝える URL を処理する方法を提供します。たとえばhttp://somewhere.overtherainbow.com/userid/123424/のように

終了パス/userid/123424/に注目してほしい

ASP.NET でこれを行うにはどうすればよいでしょうか。

4

6 に答える 6

29

この例では、ASP.NET ルーティングを使用してフレンドリ URL を実装します。

アプリケーションが処理するマッピングの例は次のとおりです。

http://samplesite/userid/1234 - http://samplesite/users.aspx?userid=1234
http://samplesite/userid/1235 - http://samplesite/users.aspx?userid=1235

この例ではクエリ文字列を使用しており、aspx ページのコードを変更する必要がありません。

ステップ 1 - 必要なエントリを web.config に追加する

<system.web>
<compilation debug="true">
        <assemblies>
            …
            <add assembly="System.Web.Routing, Version=3.5.0.0,    Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </assemblies>
    </compilation>
…
    <httpModules>
    …
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </httpModules>
</system.web>
<system.webServer>
    …
    <modules>
        …
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </modules>
    <handlers
…   
        <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler,                 System.Web, Version=2.0.0.0, Culture=neutral,              PublicKeyToken=b03f5f7f11d50a3a"/>
    </handlers>
</system.webServer>

ステップ 2 - global.asax にルーティング テーブルを追加する

フレンドリ URL から aspx ページへのマッピングを定義し、後で使用するために要求されたユーザー ID を保存します。

void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add("UseridRoute", new Route
    (
       "userid/{userid}",
       new CustomRouteHandler("~/users.aspx")
    ));
}

ステップ 3 - ルート ハンドラを実装する

ルーティングが行われる前に、クエリ文字列を現在のコンテキストに追加します。

using System.Web.Compilation;
using System.Web.UI;
using System.Web;
using System.Web.Routing;

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        // Add the querystring to the URL in the current context
        string queryString = "?userid=" + requestContext.RouteData.Values["userid"];
        HttpContext.Current.RewritePath(
          string.Concat(
          VirtualPath,
          queryString)); 

        var page = BuildManager.CreateInstanceFromVirtualPath
             (VirtualPath, typeof(Page)) as IHttpHandler;
        return page;
    }
}

users.aspx のコード

参照用の aspx ページのコード。

protected void Page_Load(object sender, EventArgs e)
{
    string id = Page.Request.QueryString["userid"];
    switch (id)
    {
        case "1234":
            lblUserId.Text = id;
            lblUserName.Text = "Bill";
            break;
        case "1235":
            lblUserId.Text = id;
            lblUserName.Text = "Claire";
            break;
        case "1236":
            lblUserId.Text = id;
            lblUserName.Text = "David";
            break;
        default:
            lblUserId.Text = "0000";
            lblUserName.Text = "Unknown";
            break;
}
于 2009-01-02T14:42:29.960 に答える
8

これは、わかりやすい URL を実装するために ASP.NET ルーティングも使用する別の例です。

アプリケーションが処理するマッピングの例は次のとおりです。

http://samplesite/userid/1234 - http://samplesite/users.aspx?userid=1234
http://samplesite/userid/1235 - http://samplesite/users.aspx?userid=1235

この例ではクエリ文字列を使用していませんが、aspx ページに 追加のコードが必要です。

ステップ 1 - 必要なエントリを web.config に追加する

<system.web>
<compilation debug="true">
        <assemblies>
            …
            <add assembly="System.Web.Routing, Version=3.5.0.0,    Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </assemblies>
    </compilation>
…
    <httpModules>
    …
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </httpModules>
</system.web>
<system.webServer>
    …
    <modules>
        …
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </modules>
    <handlers
…   
        <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler,                 System.Web, Version=2.0.0.0, Culture=neutral,              PublicKeyToken=b03f5f7f11d50a3a"/>
    </handlers>
</system.webServer>

ステップ 2 - global.asax にルーティング テーブルを追加する

フレンドリ URL から aspx ページへのマッピングを定義し、後で使用するために要求されたユーザー ID を保存します。

void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.Add("UseridRoute", new Route
    (
       "userid/{userid}",
       new CustomRouteHandler("~/users.aspx")
    ));
}

ステップ 3 - ルート ハンドラを実装する

パラメータを含むルーティング コンテキストをページに渡します。(IRoutablePage の定義に注意してください)

using System.Web.Compilation;
using System.Web.UI;
using System.Web;
using System.Web.Routing;

public interface IRoutablePage
{
    RequestContext RequestContext { set; }
}

public class CustomRouteHandler : IRouteHandler
{
    public CustomRouteHandler(string virtualPath)
    {
        this.VirtualPath = virtualPath;
    }

    public string VirtualPath { get; private set; }

    public IHttpHandler GetHttpHandler(RequestContext
          requestContext)
    {
        var page = BuildManager.CreateInstanceFromVirtualPath
             (VirtualPath, typeof(Page)) as IHttpHandler;

        if (page != null)
        {
            var routablePage = page as IRoutablePage;

            if (routablePage != null) routablePage.RequestContext = requestContext;
        }

        return page;
    }
}

ステップ 4 - ターゲット ページでパラメーターを取得する

IRoutablePage の実​​装に注意してください。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Routing;

public partial class users : System.Web.UI.Page, IRoutablePage
{
    protected RequestContext requestContext;

    protected object RouteValue(string key)
    {
        return requestContext.RouteData.Values[key];
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        string id = RouteValue("userid").ToString();
        switch (id)
        {
            case "1234":
                lblUserId.Text = id;
                lblUserName.Text = "Bill";
                break;
            case "1235":
                lblUserId.Text = id;
                lblUserName.Text = "Claire";
                break;
            case "1236":
                lblUserId.Text = id;
                lblUserName.Text = "David";
                break;
            default:
                lblUserId.Text = "0000";
                lblUserName.Text = "Unknown";
                break;
        }
    }

    #region IRoutablePage Members

    public RequestContext RequestContext
    {
        set { requestContext = value; }
    }

    #endregion
}
于 2009-01-02T15:09:13.523 に答える
1

Intelligencia の URL リライターを使用しています。

http://urlrewriter.net/

設定はとても簡単で、すべてを起動して実行するのにおそらく 1 時間ほどかかりました。それに問題はほとんどありません...

私はそれをお勧めしますが、私は他のものを試していないことを言及する必要があります.

幸運を!

于 2009-05-07T12:05:42.580 に答える
1

ASP.NET MVC を使用してそれを行う別の方法を次に示します。

まず、2 つのアクションを含むコントローラー コードを次に示します。Index はモデルからユーザーのリストを取得し、userid は個々のユーザーを取得します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class UsersController : Controller
    {
        public ActionResult Index()
        {
            return View(Models.UserDB.GetUsers());
        }
        public ActionResult userid(int id)
        {
            return View(Models.UserDB.GetUser(id));
        }
    }
}

これは Index.asp ビューです。ActionLink を使用して、正しい形式でリンクを作成します。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Index" %>
<%@ Import Namespace="MvcApplication1.Controllers" %>
<%@ Import Namespace="MvcApplication1.Models" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <div>
    <h2>Index of Users</h2>
           <ul>
            <% foreach (User user in (IEnumerable)ViewData.Model) { %>
                 <li>
                       <%= Html.ActionLink(user.name, "userid", new {id = user.id })%>
                 </li>
            <% } %>
           </ul>
    </div>
</body>
</html>

個人の詳細を表示する userid.aspx ビューは次のとおりです。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="userid.aspx.cs" Inherits="MvcApplication1.Views.Users.userid" %>
<%@ Import Namespace="MvcApplication1.Controllers" %>
<%@ Import Namespace="MvcApplication1.Models" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <div>
        <table border ="1">
            <tr>
                <td>
                ID
                </td>
                <td>
                <%=((User)ViewData.Model).id %>
                </td>
            </tr>
            <tr>
                <td>
                Name
                </td>
                <td>
                <%=((User)ViewData.Model).name %>
                </td>
            </tr>
        </table>
    </div>
</body>
</html>

最後に、完全を期すために、モデル コードを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication1.Models
{
    public class UserDB
    {
        private static List<User> users = new List<User>{
            new User(){id=12345, name="Bill"},
            new User(){id=12346, name="Claire"},
            new User(){id=12347, name="David"}
        };

        public static List<User> GetUsers()
        {
            return users;
        }

        public static User GetUser(int id)
        {
            return users.First(user => user.id == id);
        }

    }

    public class User
    {
        public int id { get; set; }
        public string name { get; set; }
    }
}
于 2009-01-05T15:26:27.763 に答える
0

この問題のために、EveryMvc/Url を Every-mvc/url に暗黙的に変換するオープン ソースのNuGet ライブラリを開発しました。

破線の URL は SEO フレンドリーで読みやすいです。小文字の URL を使用すると、問題が発生しにくくなる傾向があります。(私のブログ投稿の詳細)

NuGet パッケージ: https://www.nuget.org/packages/LowercaseDashedRoute/

これをインストールするには、プロジェクトを右クリックして NuGet パッケージ マネージャーを選択し、[オンライン] タブで [小文字の破線ルート] と入力して、Visual Studio で NuGet ウィンドウを開きます。

または、パッケージ マネージャー コンソールで次のコードを実行することもできます。

Install-Package LowercaseDashedRoute

その後、App_Start/RouteConfig.cs を開き、既存の route.MapRoute(...) 呼び出しをコメント アウトして、代わりにこれを追加する必要があります。

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

それでおしまい。すべての URL は小文字化され、破線で示され、何もしなくても暗黙的に変換されます。

オープン ソース プロジェクトの URL: https://github.com/AtaS/lowercase-dashed-route

于 2013-08-04T16:39:51.550 に答える
0

また、ASP.NET MVC を確認するか、Web フォームを使用している場合は、ASP.NET 3.5 SP1 の新しい System.Web.Routing 名前空間を確認してください。

于 2008-09-05T06:40:33.787 に答える