每个客户的Asp MVC路由

时间:2011-11-30 12:14:38

标签: asp.net-mvc asp.net-mvc-3

我在MVC 3中有一个项目,我想为每个客户提供一个特定的URL。

样品:

www.mysite.com/CustomerOne

www.mysite.com/CustomerTwo

我已经注册了所有路线并且效果很好。

问题是:我必须在所有操作中期望客户名称的第一个参数。

我喜欢类似的东西,在自定义控制器上有一个属性,告诉我客户在哪里。

代码:

routes.MapRoute(
    "PerCustomer", // Route name
    "{customer}/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", customer = UrlParameter.Optional, id = UrlParameter.Optional } // Parameter defaults
);

public class HomeController : Controller
{
    public ActionResult Index(string customer)
    {
        //do stuff
        return View();
    }

    public ActionResult SaveSomething(string customer, string param1, ...)
    {
        //save stuff for the customer
        return View();
    }
}

谢谢..

3 个答案:

答案 0 :(得分:1)

像这样创建一个BaseControoler类:

public class BaseController : Controller
{
     public string CurrentCustomer
     {
        get
        {
            return (string)RouteData.Values["customer"];
        }
     }
}

并在您的控制器中:

public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
        //do stuff 
        DoSomethinwWith(this.CurrentCustomer);
        return View(); 
    } 

    public ActionResult SaveSomething(string param1, ...) 
    { 
        DoSomethinwWith(this.CurrentCustomer);
        return View(); 
    } 
} 

答案 1 :(得分:0)

这可能是should be modelbound,甚至更好,你应该在你的控制器上放置一个ActionFilter,以确保来自一家公司的客户不会从另一家公司的客户那里接收客户。

在不了解您的问题的情况下(例如,每个客户拥有哪些信息,如果这些信息保存在ASP.NET成员资格系统或其他系统中,那么告诉您实际需要的内容会更加困难。) p>

答案 2 :(得分:0)

您可以执行以下操作:

routes.MapRoute(
    "PerCustomer", // Route name
    "/Profile/{customer}/{action}", // URL with parameters
    new { controller = "Customer", action = "Index", customer = UrlParameter.Optional, action = UrlParameter.Optional } // Parameter defaults
);

这将允许您为查看模式执行/ profile / Customer1和/ profile / customer1 / edit以编辑客户。因为你需要某种独特的路径元素来明确地识别所有其他路由器。

我希望这会对你有所帮助