如何从mvc4中的控制器操作方法将字符串附加到请求的URL

时间:2014-08-08 06:41:49

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing

我正在开发一个网站,其中包含一些使用MVC4和实体框架的教程。 所有教程都将保存在数据库中,并根据请求的URL中提供的Tutorial Id(比如TId),它将在action方法中检索有关该教程的所有信息,并在视图中呈现并显示给用户。下面提到了示例网址。

网址:www.mysite.com/Tutorials/Show/452

教程是控制器名称,显示是操作方法名称。

这里452是TId。因此,当请求此URL时,将显示TId 452的教程。但我想要的是,我想在最后添加虚线教程名称,如下所示。

www.mysite.com/Tutorials/Show/452/My-Test-Tutorial

我可以用' - '替换空格。并生成字符串,但我找到了一种方法将其附加到URL。

这与stackoverflow站点完美配合。 例如,即使我们要求" In MVC4, how to redirect to a view from a controller action with parameters in the Url?" ,ID " 20035665" 的问题也会显示出来网址将更改为" In MVC4, how to redirect to a view from a controller action with parameters in the Url?"

任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:3)

假设我理解你的问题,我建议的解决方案是:

将以下更改添加到路由机制:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Tutorials",
            url: "Tutorials/{id}/{title}",
            defaults: new { controller = "Tutorials", action = "Show", title = UrlParameter.Optional },
            constraints: new { id = @"\d+" }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

然后在你的Tutorials控制器中:

public class TutorialsController : Controller
{
    // GET: /Tutorials

    public ActionResult Index()
    {
        // here you can display a list of the most recent tutorials or whatever
        return View();
    }

    // GET: /Tutorials/1 (will be redirected to the one below)
    // GET: /Tutorials/1/Intro-into-ASP_NET-MVC

    public ActionResult Show(int id, string title)
    {
        string key = string.Format("tutorial-{0}", id.ToString());
        Tutorial model = TempData[key] as Tutorial;

        // if this is not a redirect
        if ( model == null )
        {
            model = GetTutorial(id);
        }

        // sanitize title parameter
        string urlParam = model.Title.Replace(' ', '-');
        // apparently IIS assumes that you are requesting a resource if your url contains '.'
        urlParam = urlParam.Replace('.', '_');
        // encode special characters like '\', '/', '>', '<', '&', etc.
        urlParam = Url.Encode(urlParam);

        // this handles the case when title is null or simply wrong
        if ( !urlParam.Equals(title) )
        {
            TempData[key] = model;
            return RedirectToAction("Show", new { id = id, title = urlParam });
        }

        return View(model);
    }

    private Tutorial GetTutorial(int id)
    {
        // grab actual data from your database
        Tutorial tutorial = new Tutorial { Id = 1, Title = "Intro into ASP.NET MVC" };
        return tutorial;
    }
}

更新:

上述解决方案将重定向
/教程/ 1

/教程/ 1 /简介 - 进入 - ASP_NET-MVC

如果您确实想在网址中显示操作名称,例如 / Tutorials / Show / 1 / Intro-into-ASP_NET-MVC ,您只需更改&#34;网址&#34 ;在&#34;教程&#34;路线到url: "Tutorials/Show/{id}/{title}"

您还可以将RedirectToAction替换为RedirectToRoute("Default", new { id = id, title = urlParam });,这将确保它与名为&#34;默认&#34;的路线匹配,但此方法将产生以下网址: www.mysite.com /教程/显示/ 1→标题=简介 - 进入 - ASP_NET-MVC

答案 1 :(得分:1)

您可以使用以下路线配置,当您创建网址时,您可以将教程标题传递给转换给定text to URL friendly text的方法。

示例

在路线配置

routes.MapRoute(
    name: "Tutorials",
    url: "{controller}/{action}/{tid}/{title}",
    defaults: new { controller = "Tutorials", action = "Show", tid = UrlParameter.Optional, title = UrlParameter.Optional }
);

创建网址时的视图

<a href='@Url.Action("Tutorials", "Show", new { tid = tutorial.ID, title = ToFriendlyUrl(tutorial.Title) })'>My Tutorial</a>

然后在Show方法

public ActionResult Show(int tid, string title)
{
    // if the title is missing you can do a redirect inside action method

    return View();
}