目标: 我希望能够输入网址:www.mysite.com/NewYork或www.mysite.com/name-of-business
取决于我想要在不更改URL的情况下路由到不同操作的字符串。
到目前为止,我有:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute(
"UrlRouter", // Route name
"{query}", // URL with parameters
new { controller = "Routing", action = "TestRouting" } // Parameter defaults
);
}
在控制器中我有:
public ActionResult TestRouting(string query)
{
if (query == "NewYork")
return RedirectToAction("Index", "Availability"); // <--------- not sure
else if (query == "name-of-business")
return Redirect("nameofbusines.aspx?id=2731"); // <--------- not sure
else
return RedirectToAction("TestTabs", "Test"); // <--------- not sure
}
我已经尝试了所有内容,无需重定向/转移到页面 更改网址,但我尝试的所有内容都会更改网址或给我一个错误。
基本上我正在寻找相当于server.transfer的地方,我可以保留URL但是将信息发送给动作并让它显示结果。
答案 0 :(得分:5)
我和Nick在一起,但我认为你可以使用常规视图而不必做部分视图。如果它们不在与控制器相对应的视图中,则可能需要将它们实现为共享视图(因为它只会查看关联视图和共享视图)。
public ActionResult TestRouting(string query)
{
if (query == "NewYork")
{
var model = ...somehow get "New York" model
return View("Index", model );
}
else if (query == "name-of-business")
{
var model = ...get "nameofbusiness" model
return View("Details", model );
}
else
{
return View("TestTabs");
}
}
然后,每个视图将采用模型的特定实例并使用模型呈现其内容。该网址不会更改。
无论何时使用RedirectResult,您实际上都会向浏览器发送HTTP重定向,这会强制更改URL。
答案 1 :(得分:2)
您可以像这样更改控制器:
public ActionResult TestRouting(string query)
{
string controller,action;
if (query == "NewYork")
{
controller = "Availability";
action = "Index";
}
else
{
controller = "Test";
action = "TestTabs";
}
ViewBag.controller = controller;
ViewBag.action = action;
return View();
}
然后您可以在视图中使用这些ViewBags:
@{
Layout = null;
Html.RenderAction(ViewBag.action, ViewBag.controller);
}
就是这样。您可以使用类和一些函数来改进此示例。
答案 2 :(得分:1)
我不确定你是否尝试过这种方式,或者这种方式有什么缺点..
将global.asax文件添加到项目中。在那里添加以下方法:
void Application_BeginRequest(object sender, EventArgs e)
{
// Handles all incoming requests
string strURLrequested = Context.Request.Url.ToString();
GetURLToRedirect objUrlToRedirect = new GetURLToRedirect(strURLrequested);
Context.RewritePath(objUrlToRedirect.RedirectURL);
}
GetURLToRedirect可以是一个具有根据输入的URL查找实际URL的逻辑的类。[RedirectURL]属性将设置为使用url重定向到工作表下方。
希望有帮助...
答案 3 :(得分:0)
你是说你想去“www.mysite.com/NewYork”,然后“真的”去“其他地方”,但留下网址?也许您想要做的是使用部分视图来实现这一点?这样,您的基页将被路由到,然后在该页面内进行条件测试以显示不同的部分视图?我已经在我的应用程序中完成了查看网格的只读版本或可编辑网格。它工作得非常好。
答案 4 :(得分:0)
我不确定您可以对重定向到.aspx页面做些什么,但您应该能够用以下内容替换RedirectToAction(...)s
:
public ActionResult TestRouting(string query)
{
if (query == "NewYork")
{
var controller = new AvailabilityController();
return controller.Index();
}
else if (query == "name-of-business")
return Redirect("nameofbusines.aspx?id=2731"); <--------- not sure
else
{
var controller = new TestController();
return controller.TestTabs();
}
}