2016-02-28 2 views
-1

Поскольку я создаю раздел блога на своем веб-сайте, я хотел бы знать, как отображать каждый из сообщений в блоге в уникальный шаблон страницы или мнение. Я не хочу создавать aspx вручную, а затем называть их заголовками SEO.Динамически генерирующий дружественный URL-адрес и рендеринг содержимого из базы данных SQL в уникальной странице для всех сообщений, нажатых в Asp.Net C#

Шаг 1: Я создал таблицу, в которой он может полностью хранить все детали, включая изображение, содержимое, заголовок, и я могу получить эти значения, чтобы связать их дальше в ретрансляторе. Рабочие штрафы

Шаг 2: Однако, теперь, следующая страница, есть страница с подробными сведениями о блоге, которая будет отображаться при нажатии на любой из блогов, но будет ли она иметь другой URL-адрес, соответствующий совпадению с заголовком?

Предположим, в настоящее время URL-адрес www.xyz.com/blog/blogdeatils.aspx, и если он представляет статью, в которой говорится о википедии, тогда я хочу, чтобы мой URL-адрес был www.xyz.com/blog/how-wikipedia-works (без расширения aspx)

Возможно ли это? Спасибо всем

+0

Ссылка на .aspx означает Web-формы (а не MVC). Вы можете использовать маршрутизацию в Web Forms для направления нескольких URL-адресов на одну и ту же страницу. – Richard

+0

любые ссылки для них? Я уже добавил некоторый код в глобальный файл, где я могу получить страницы для контакта из contact.aspx, но как сделать динамический url-генерация? это возможно ? как ссылаться на каждое сообщение блога на той же странице?Заранее спасибо –

ответ

2

Это называется «маршрутизация». Добавить Global.asax в свой проект и дальше, просто пример файла:

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.Web.Routing" %> 


<script runat="server"> 

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

} 

void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapPageRoute("Article", "blog/{name}", "~/BlogDetails.aspx"); 
} 

void Application_End(object sender, EventArgs e) 
{ 
    // Code that runs on application shutdown 

} 

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs 

} 

void Session_Start(object sender, EventArgs e) 
{ 
    // Code that runs when a new session is started 

} 

void Session_End(object sender, EventArgs e) 
{ 
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode 
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised. 

} 

И в вашем BlogDetails.aspx вы можете использовать следующий код для извлечения названия статьи :

string article_name = Page.RouteData.Values["name"] == null ? "No article" : Page.RouteData.Values["name"].ToString(); 

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

+0

Спасибо за время и ответ, хотя код немного объяснительный, я хочу знать, может ли приведенный выше код помочь мне сказать, например, я ввел 5 статей в свой db с изображением, заголовком, контентом ... теперь, когда я получить их через ретранслятор, я могу видеть их все на одной странице, но я беспокоюсь, если кто-то нажимает на конкретный блог, тогда они должны быть отправлены в blogdetails.aspx, но url должен отображаться по-разному в соответствии с заголовком, хранящимся в db. то, что я понял в коде ur, заключается в том, что мы ссылаемся на blogdetails.aspx, но, пожалуйста, заполните пробел и очистите мои сомнения, большое спасибо –

+0

@santhoshkumarB, как вы могли видеть, у вас есть маршрут вроде * blog/{name} * с перенаправлением на * blogdetails.aspx *. Это означает, что * blog/how-to-clean-a-car *, * blog/how-to-clean-a-home *, * blog/how-to-wash-a-dish * и т. Д. Будут перенаправлены на * blogdetails.aspx *, но в поле адреса вы увидите как * xyz.com/blog/how-to-clean-a-car *. В * blogdetails.aspx * вы получите значение маршрута и будете работать с ним. Пример: * RetrieveDetailsByArticleName (Страница. RouteData.Values ​​["name"]) *. Надеюсь, вы это поняли – Khazratbek

+0

Я ждал вашего ответа, тем временем делал некоторые исследования по этому вопросу. если кто-то посещает мой сайт для блога/How-to-clean-a-home, вы хотите сказать, что я смогу понять это в файле blogdetails.aspx за файлом с помощью метода (PageRouteData.Values ​​[" имя"]) ? точно так же, как вы проверяете сеансы? поэтому, как только я получу значения в строке, что дальше? –

1

Ваш Global.ascx содержание файла:

<%@ Application Language="C#" %> 
<%@ Import Namespace="System.Web.Routing" %> 


<script runat="server"> 

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

void RegisterRoutes(RouteCollection routes) 
{ 
    routes.MapPageRoute("Article", "blog/{name}", "~/BlogDetails.aspx"); 
    routes.MapPageRoute("Main Page", "Home", "~/Default.aspx"); 
} 

void Application_End(object sender, EventArgs e) 
{ 
    // Code that runs on application shutdown 
} 

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs 
} 

void Session_Start(object sender, EventArgs e) 
{ 
    // Code that runs when a new session is started 
} 

void Session_End(object sender, EventArgs e) 
{ 
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode 
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised. 
} 

Потребляйте что у вас есть таблица статей, которая содержит такие столбцы как ID, имя, изображения, информация. И у вас есть Изображение управление изображением и Ярлык контроль за подробной информацией в вашем BindDetails.aspx. Так что ваши BindDetails.aspx.cs будет (за исключением имен):

protected void Page_Load(object sender, EventArgs e){ 
    if (Page.RouteData.Values["name"] == null) 
     Response.Redirect("~/Home"); 
    else{ 
     string name = Page.RouteData.Values["name"].ToString(); 
     if (!IsPostBack) 
      RetrieveArticleByItsName(name); 
    } 
} 

protected void RetrieveArticleByItsName(string article){ 
    SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["YourConnectionName"].ConnectionString; 
    SqlCommand cmd = new SqlCommand("select TOP 1 * from Articles where lower(name) = lower(@name)", con); 
    cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = article; 

    try{ 
     con.Open(); 
     SqlDataReader sdr = cmd.ExecuteReader(); 
     sdr.Read(); 
     imgImage.ImageUrl = "your_folder/" + sdr["image"].ToString(); 
     lblDetails.Text = sdr["info"].ToString(); 
    } 
    catch(Exception ex){ 
     //work with exceptions 
     Response.Write("<script language='javascript'>alert('" + ex.Message.ToString() + "');</script"); // Get alert with exception 
    } 
    finally{ 
     con.Close(); 
    } 
} 

И давайте думать, что у вас есть две статьи с названиями «Как к очистке дома» и "How- to-clean-a-car ". Теперь вы можете дать все ссылки, такие как xyz.com/blog/How-to-clean-home и xyz.com/blog/How-to-clean-a-car и он будет работать.

Надеюсь, это поможет.

+0

фантастический Бро, спасибо за ваше объяснение, Еще одно сомнение здесь, не следует ли присваивать имя знаку привязному тегу? в настоящее время мой якорный тег выглядит так: "><%#Eval("Heading")%>, это помогает мне в загрузке страницы, как этот int.TryParse (Request.QueryString ["Id"], out Id); ..Now, что я должен заменить свой Eval ID, если я должен реализовать ваше решение? как я могу присвоить значение сначала? очень восхищаюсь вашим вкладом в это –

+0

* <%#Eval("NAME") %> * Замените * NAME * на столбец с названием статьи – Khazratbek

+0

Это будет что-то вроде * How-to-clean-a-computer * – Khazratbek

Смежные вопросы