url rewriting in mvc4 with razor engine

asp.net-mvc, asp.net-mvc-4, query-string, url-rewrite-module, url-rewriting

Solution

You must map this route before all the other route mappings (routes are evaluated in order):

routes.MapRoute(
  name: "Product", // any name meaningful for you is right
  url: "Product/{productName}",
   defaults: new { controller = "Product", action = "CategoryLevel" }
);

This route will catch all the URLS that look like this:

http://myserver/Product/X

whatever X is. If you do so, your action should look like this:

public ActionResult CategoryLevel(string productName)

NOTE: The parameter name must match the segment in the route mapping: `productName`

So, whenever the user types:

http://myserver/Product/Vitamins

the action `CategoryLevel` will be executed, and it will receive the `productName` parameter with the value `"Vitamins"`

The problem is that if you have an action `List` which you expect to be invoked like this

http://myserver/Product/List

the route will map it and will invoke the `CategoryLevel` action with the `productName` = `"List"`

To avoid this you can use this route:

routes.MapRoute(
  name: "Product", // any name meaningful for you is right
  url: "ViewProduct/{productName}",
   defaults: new { controller = "Product", action = "CategoryLevel" }
);

Which will be different from the others, and anything will work fine. The URLs specific for this method will look like this:

http://myserver/ViewProduct/TheProductName

and the other routes will work as expected.

By the way: you should have an specific action for the product, for example `View`, instead of `CategoryLevel`. So, the route and the action would look like this:

    routes.MapRoute(
        name: "ViewProduct", // any name meaningful for you is right
        url: "ViewProduct/{productName}",
        defaults: new { controller = "Product", action = "View" }
    );

The action, inside the product controller:

public ActionResult View(string productName)

The route is used both for mapping a user typed url to the corresponding action, and for generating URLs by using some of the MVC helpers, like `Html.ActionLink` or `Url.Action`. So, if you do something like this:

Url.Action('View', 'Product', new {productName = "Vitamins"} )

you'll get the expected, short URL:

http://myserver/ViewProduct/Vitamins

I.e. the route map it's a two-way map that can map URLs to actions and viceversa.

Problem

I want to rewrite following url - `http://localhost:99/Product/CategoryLevel?CategoryId=65&ProductName=Vitamins` with `http://localhost:99/Product/Vitamins`, (or) `http://localhost:99/Product/CategoryLevel/Vitamins` (or) `http://localhost:99/Vitamins` (or) how to remove (or) hide the querystring from the url (that was shown to the users)? I tried using url rewrite module(iis) and asp.net routing and search for the solution in the internet,but i didn't find right solution for this,please suggest any solutions.

Original source