.NET MVC 3:如何在重定向到操作 GET 操作中隐藏参数



我正在尝试在.NET MVC3中参数化get方法。假设我有一个 get 方法(简化):

[HttpGet]
public ActionResult Message(string message)
{
    ...
    return View(message);
}

还有一个帖子方法:

[HttpPost]
public ActionResult DoSomething() 
{
    ...
    return RedirectToAction("Message", new { message = ok ? "Done it" : "Nope" });
}

这样做的原因是,我可能从各种不同的 Post 方法动态生成了许多不同的消息,我想在公共视图中显示它们。消息视图也相当复杂,所以我想避免重复代码。参数化消息操作确实是完美的解决方案。

这工作正常,除了一件事:消息字符串始终存在于 URL 中,这对用户来说看起来不是很好。最大 URL 长度等也存在潜在问题。

例如 http://www.domain.com/Controller/Message?message=Nope

我真正想要的是从 Get 方法返回包含正确消息的消息页面,但同时让 URL 刚刚读取:http://www.domain.com/Controller/Message

有人有什么想法吗?谢谢

您可以将消息存储在 Session 中,然后在消息操作中将其从会话中删除。

正如 SLaks 所说,消息可以存储在服务器端,但Controller.TempDataSession 更适合于此。

为什么要重定向到操作? 为什么不直接按行呈现该视图。 如果你需要运行特定的代码,你甚至可以有一个基本控制器来实现它并从它继承,这样你就不会重复自己。 注: 您可以将Message视图保留在"共享视图"文件夹中,以便可以为任何控制器找到它。

public abstract class BaseController : Controller
{
     public ActionResult MessageView(string message)
     {
         ... some common logging functions or such...
         return View("Message",message);
     }
}

称为

public class FooController : BaseController
{
    [HttpPost]
    public ActionResult DoSomething() 
    {
        ...
        return MessageView( ok ? "Done it" : "Nope" );
    }
}

除了Controller.TempData之外,另一个可行的解决方案是使用cookie。

我认为最好的方法是饼干。此方法将帮助您节省应用程序的 RESTfulness。我的意思是没有服务器保存的数据

最新更新