Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 重定向到操作并需要传递数据_Asp.net Mvc_Redirect - Fatal编程技术网

Asp.net mvc 重定向到操作并需要传递数据

Asp.net mvc 重定向到操作并需要传递数据,asp.net-mvc,redirect,Asp.net Mvc,Redirect,我有一个控制器,可以处理三个特定于我的问题的操作 第一个是编辑操作,它返回一个带有HTML表单的视图,用户可以编辑给定项的属性 第二个是更新操作,它接受浏览器的回发表单并更新数据库。更新成功后,我们将重定向到操作 第三个是show操作,它显示给定项目的详细信息。更新成功后,我们将重定向到此操作 流程是: 显示->编辑->更新(成功:y->重定向到显示,n->返回编辑) 我想要实现的是在更新成功时触发一个标志,以便在下一个Show视图中为用户显示确认消息。问题是我不能100%确定通过Redirec

我有一个控制器,可以处理三个特定于我的问题的操作

第一个是编辑操作,它返回一个带有HTML表单的视图,用户可以编辑给定项的属性

第二个是更新操作,它接受浏览器的回发表单并更新数据库。更新成功后,我们将重定向到操作

第三个是show操作,它显示给定项目的详细信息。更新成功后,我们将重定向到此操作

流程是:

显示->编辑->更新(成功:y->重定向到显示,n->返回编辑)

我想要实现的是在更新成功时触发一个标志,以便在下一个Show视图中为用户显示确认消息。问题是我不能100%确定通过RedirectToAction()调用传输数据的最佳方式。我有一个想法是使用查询字符串?我们已经将查询字符串中的变量用于另一个目的,但我的一部分对滥用它表示怀疑。下面是对重定向的调用

RouteValueDictionary dict = Foo.GetRouteValues(bar);

RedirectToAction("Show", dict);
我也读过这个问题,但如果不需要的话,我会学习如何使用TempData属性


谢谢你的建议

编辑:抱歉,最初没有看到您关于不想使用TempData的说明

简言之,如果客户端刷新/重新加载他们重定向到的页面,您希望您的消息重新出现吗

如果是,则使用querystring,类似于:

return(RedirectToAction("Index", new { message = "hi there!" }));
然后要么定义

public ActionResult Index(string message) { }
或者显式拉出Request.QueryString[“message”]并以通常的方式通过ViewData将其传递给视图。这也适用于不接受来自您站点的cookie的浏览器

如果您不想再次显示该消息,则ASP.NET MVC 1.0将为此提供TempData收集

TempData属性值以会话状态存储,直到同一浏览器的下一个请求被清除为止。因此,如果您在返回RedirectToAction之前立即将某些内容放入TempData中,则它将在重定向结果中可用,但随后会立即被清除

下面是对ASP.NET MVC启动项目中HomeController的一个简单更改:

public ActionResult Index() {
    ViewData["Message"] = "Welcome to ASP.NET MVC!";
    return View();
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string submitButton) {
    TempData["message"] = "You clicked " + submitButton;
return(RedirectToAction("Index"));
}

public ActionResult About() {
    return View();
}
相应的view/Views/Home/Index.aspx应该包含如下内容:

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
  <% if (TempData["message"] != null) { %>
    <p><%= Html.Encode(TempData["message"]) %></p>
  <% } %>
  <% using (Html.BeginForm()) { %>
    <input type="submit" name="submitButton" value="Button One" />
    <input type="submit" name="submitButton" value="Button Two" />
  <% } %>
</asp:Content>

了解更多信息。

也从来不是
TempData
的粉丝,此外,我不想在URL中传递成功标志,因为我不想看到它

应用程序/设置?saveSuccess=true

在浏览器的URL栏中

我的解决方案使用临时cookie:

[HttpPost]
public ActionResult Settings(SettingsViewModel view)
{
    if (ModelState.IsValid)
    {
        //save
        Response.SetCookie(new HttpCookie("SettingsSaveSuccess", ""));
        return RedirectToAction("Settings");
    }
    else
    {
        return View(view);
    }     
}
并在相应的Get action中检查是否存在此Cookie并将其删除:

[HttpGet]
public ActionResult Settings()
{
    var view = new SettingsViewModel();
    //fetch from db and do your mapping
    bool saveSuccess = false;
    if (Request.Cookies["SettingsSaveSuccess"] != null)
    {
        Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "") { Expires = DateTime.Now.AddDays(-1) });
        saveSuccess = true;
    }
    view.SaveSuccess = saveSuccess;
    return View(view);
}

注意:如果你开始通过比布尔标志更复杂的任何东西,那么这可能是一个相当不稳定的斜率

谢谢你的解释。既然我们使用的是2.0,我就来看看这篇文章。我在我的帖子中提到,我想远离TempData属性,但是如果这是事实上的方式,那么可能不会那么糟糕。再次感谢。这是一个老问题,但链接现在已断开:(文章的现代(ish)工作链接(向下滚动大约一半):嗨-如果将确认消息的字符串传递给cookie值(例如,您的设置已保存ok,或设置未保存),会有什么危险?@Bartosz您是否可以使用布尔值,然后根据该值设置响应消息?如果响应消息可能不止两件事,那么您必须对其采取务实的态度-感觉有点错误-即如果您有多条错误消息,则应在重定向之前显示-如果您的设置未保存,则应and由第一段代码中的else语句引导,不应重定向