URL-маршрутизация в .aspx - PullRequest
2 голосов
/ 15 августа 2011

Я работаю на веб-сайте по недвижимости и использую маршрутизацию URL, чтобы мой клиент мог в своих рекомендуемых свойствах показать свой адрес в URL: www.realestatewebsite.com/featured/123-Fake-St

Тем не менее, я новичок в URL Routing и думаю, что выбрал плохой ярлык.Первоначально я хотел бы использовать первичный ключ моей базы данных для доступа к свойствам (propID), но не хотел передавать его в URL, поэтому вместо этого использовал адрес, чтобы получить propID и использовать его оттуда.Однако, если я пытаюсь назначить Page.RouteData.Values ​​["address"] строке, и в URL-адресе нет адреса, он выдает исключение.Поэтому у меня есть оператор try / catch, чтобы справиться с этим.Это кажется плохой практикой для меня все же.Если кто-нибудь может сказать мне, приемлемо ли это сделать, или если есть гораздо лучшее решение, пожалуйста, дайте мне знать.

Вот Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapPageRoute("", "Featured/{address}", "~/Featured/Default.aspx");
}

А вот метод с www.website/com/Featured/Default.aspx:

protected int getPropID()
{
    string address;
    int propID = -1; //If the method returns -1 the page just lists all featured properties

    try
    {
        address = Page.RouteData.Values["address"].ToString();
    }
    catch (Exception ex)
    {
        return propID;
    }

    if (address != null)
    {
        string strSQL = "SELECT propID FROM tblFeatured WHERE address = '" + address + "'";
        DataTable dt = da.FillDataTable(strSQL);
        if (dt.Rows.Count > 0)
            propID = Convert.ToInt32(dt.Rows[0]["propID"]);
        return propID;
    }
    else
        return propID;
}

Ответы [ 3 ]

2 голосов
/ 16 августа 2011

Вы подходите к этому типичным образом. Маршрутизация URL Скотта Гу с ASP.NET 4 показывает тот же шаблон, который вы используете.

  • настройка маршрута
  • убедитесь, что токен находится где-то в URL
  • при загрузке страницы вашей целевой страницы .aspx, получить токен, запросить базу данных.
  • отображает вашу разметку, необходимую для этого токена

Если вы искали предложения:

  • В каждом свойстве должен быть предварительно извлечен 'slug' или токен из вашей базы данных. Просто другое свойство для запроса, а не числовой идентификатор. DataTable не сильно помогает.
  • Сохраните свой токен в качестве адреса улицы (возможно, укажите город для SEO-сока, если ваш клиент не против)
  • Используйте этот токен для поиска записи о доме / собственности в базе данных. Забудьте числовые идентификаторы на этом этапе. ВЫБЕРИТЕ свойство, в котором совпадает токен, и запишите его на страницу. Разница в производительности равна нулю.
string propertyToken =  Page.RouteData.Values["address"].ToString();

Property p = PropertyDatabase.GetSingleByToken(propertyToken);

if(p!=null)
{
    WritePropertyToPage(p);
}
else
{
    //write to page that token wasn't found/misspelled/expired/etc.
}
0 голосов
/ 16 августа 2011

Ваша интуиция верна, бросая, когда Page.RouteData.Values ​​["address"] не определено, является плохой практикой, особенно потому, что это совершенно разумно, чтобы не существовать.

Проверка на нулевое значение перед попыткой вызова метода для объекта всегда является хорошей практикой. Вы могли бы также рассмотреть оператор объединения? (см. http://msdn.microsoft.com/en-us/library/ms173224.aspx),, хотя некоторые считают, что это некрасиво и / или трудно читать.

0 голосов
/ 15 августа 2011

Вы смотрели на Обзор маршрутизации ASP.NET MVC (C #) ?Вот мое предложение о том, где искать ASP.NET MVC Framework (часть 2): маршрутизация URL также содержит несколько советов, которые, возможно, стоит изучить в некоторой степени, так как у вас есть что-то RESTful в некотором смысле.По крайней мере, это то, что я хотел бы рассмотреть, прежде чем опробовать решения для веб-форм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...