2012-03-12 57 views
11

我的操作方法是这样的:ASP.NET MVC中删除的操作方法查询字符串

public ActionResult Index(string message) 
{ 
    if (message != null) 
    { 
    ViewBag.Message = message; 
    } 
    return View(); 
} 

什么情况是,请求该网址看起来像:

www.mysite.com/controller/?message=Hello%20world 

但我希望它看起来只是

www.mysite.com/controller/ 

有没有办法去除actionmethod内的查询字符串?

+0

你是说你想要一个默认消息,当他们不输入查询字符串?或者你想隐藏查询字符串,而不管最初在URL上发送的消息类型如何? – 2012-03-12 18:55:52

+0

第二个,基本上我想处理消息(可以是任何东西),而不是显示在网址上。 – willvv 2012-03-12 19:30:41

回答

15

不,除非使用POST方法,否则信息必须以某种方式传递。另一种可能是使用中间类。

// this would work if you went to controller/SetMessage?message=hello%20world 

public ActionResult SetMessage(string message) 
{ 
    ViewBag.Message = message ?? ""; 
    return RedirectToAction("Index"); 
} 

public ActionResult Index() 
{ 
    ViewBag.Message = TempData["message"] != null ? TempData["message"] : ""; 
    return View(); 
} 

或者。如果你只是使用POST

//your view: 
@using(Html.BeginForm()) 
{ 
    @Html.TextBox("message") 
    <input type="submit" value="submit" /> 
} 


[HttpGet] 
public ActionResult Index() 
{ return View(); } 

[HttpPost] 
public ActionResult Index(FormCollection form) 
{ 
    ViewBag.Message = form["message"]; 
    return View(); 
} 
+1

是的,正是我的想法。最后我做类似的事情:\t \t \t \t如果 \t \t \t \t { \t \t \t \t \t的TempData [ “消息”] =消息(消息!= NULL) \t \t \t \t \t return RedirectToAction(“Index”); \t \t \t \t} \t \t \t \t如果(TempData.ContainsKey( “消息”)) \t \t \t \t { \t \t \t \t \t ViewBag.Message = TempData的[ “消息”]; \t \t \t \t \t TempData.Remove(“Message”); \t \t \t \t},它基本上保存消息,然后重新加载没有参数的相同actionmethod。 – willvv 2012-03-12 19:28:04

+0

这仍然是最好的解决方案吗?我有一个页面只显示在某些时间,它需要一个模型,但这个行动是不公开的,我希望它有一个像/注册/ AfterHours和/注册/ AfterHours漂亮的URL?DateTime ... [疯狂的字符]。无论如何,这确实奏效。 – 2016-06-28 03:52:20

2

我不确定你是否真的在想这件事。如果你删除了查询字符串...那么你删除了查询字符串..即,你的页面将不会有查询字符串值来做它需要做的事情。

有一堆你可以做的不同的黑客..所有这些都不理想。您可以使用JavaScript去除查询字符串。设置会话变量后,您可以重定向到querystring-less页面。这非常难看。

请记住,用户在地址栏中看到的内容是在客户端上。客户端控制它。你可以通过JavaScript来摆弄它,但这样做通常是一个糟糕的主意。由于隐藏用户的东西可以被视为类似恶意软件的行为。

1

调查routes。他们定义了如何写一个带参数的url。

如果您创建了一个新的MVC应用程序,并查看了RegisterRoutes()下的Global.asax.cs文件。你应该看到一个条目。

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

看看各部分:

  • “默认” 这个名字。这对于您创建的每条路线都必须是唯一的。
  • “{controller}/{action}/{id}”是您要使用的模式。 example.org/home/index?id=2将被写入example.org/home/index/2而不是
  • 新{controller =“home”,action =“index”,id = UrlParameter.Optional}定义了默认值,如果没有指定。

所以,这条路线让它所以如果你去example.org它会假设你的意思example.org/home/index{id是可选}

从此开始工作,您可以开始了解如何创建自己的路线。

现在,解决你的问题简单的答案是肯定的可以使URL看起来像,但没有真正。你将不得不定义一条具有默认消息的路由,并且只有当某人没有指定消息时才会这样。你必须告诉控制器信息是什么。我很抱歉,但最好你可以做的是定义一条路线,让你

/message/Hello%20World并使用字符串。替换使得看起来更好看`'/ message/hello_world'

+0

他没有试图添加一个友好的参数,他想要以某种方式有一个查询字符串值,但不显示它在URL中。 – 2012-03-12 18:48:44

+0

如果你读了我的整个答案,你会看到我的地址 – Joe 2012-03-12 18:50:33

0

我推荐使用一个slu。。看看这篇文章:SOF Slug post 在以前的应用程序中,我采取了这种方法从URL中删除querystrings。