【问题标题】:Redirect from controller to another view of another controller从控制器重定向到另一个控制器的另一个视图
【发布时间】:2017-09-07 09:52:02
【问题描述】:

我有两个控制器 HomeBookReservation ,我正在尝试从 BookReservation 控制器重定向到 Home 控制器的视图,而不重定向到家庭控制器的索引 if possible

这是我对BookReservation 控制器的操作:

Validate_rules函数返回List<string[]>并将它们存储在tempdata

 [HttpPost]
    public ActionResult Validate_Data(ReservationDetails reservation_details)
    {
        TempData["verification_errors"] = Validate_rules(reservation_details);//this function return List<string[]>  

        return RedirectToAction("Index");
    }

这里是home 的视图 index.cshtml 我获取临时数据并显示它的元素:

 @{
                    List<string[]> validate_rules = new List<string[]>();
                    if (TempData["verification_errors"] != null)
                    {
                        validate_rules = (List<string[]>)TempData["verification_errors"];

                    }
                }                   

                @foreach (var item in validate_rules)
                {                        
                    <label >@item[0].ToString() @item[2].ToString()</label>
                }

问题是我无法在视图标签内显示validate_rules 元素我不知道当我从BookReservation 控制器重定向临时数据时问题出在哪里?

这是家庭控制器:

  [HttpGet] 
    [ActionName("Index")]
    [HandleError]
    public ActionResult Index_Get(string submit)
    {
        bool ParamsChanged = mySessionObject.Parameters.LoadQueryParameters(Request);

        if (ParamsChanged)
            return RedirectToAction("Index", mySessionObject.Parameters.GetQueryParameters());

        LoadHotelDetails();           
        GetHotelAvailability();

        ViewBag.data = TempData["verification_errors"];

        return View("Index",myViewModel);
    }

有什么建议吗?

【问题讨论】:

  • 我建议改用Session["verification_errors"]TempData 存储在第一个和后续响应中,当返回第二个控制器上的视图时,TempData 值可能已经丢失。

标签: c# arrays asp.net-mvc list razor


【解决方案1】:

改变这个return RedirectToAction("Index");
在 Book Reservation 控制器中返回 RedirectToAction("Index","Home");

图书预订控制器 -

[HttpPost]
public ActionResult Validate_Data(ReservationDetails reservation_details)
{
    TempData["verification_errors"] = Validate_rules(reservation_details);//this function return List<string[]>

    return RedirectToAction("Index", "Home");
}

-- 家庭控制器

public ActionResult Index()
{
      ViewBag.data= TempData["verification_errors"];
}   

--查看

if (ViewBag.data!= null)
  {
    var list = ViewBag.data;
    foreach (var item in list)
     {                        
       <label >@item[0].ToString() @item[2].ToString()</label>
     }
  }

【讨论】:

  • 我还是有同样的问题
  • 你好 hashim 现在试试上面的方法可能对你有用
  • 我认为[HttpPost] public ActionResult Validate_Data(ReservationDetails reservation_details) { TempData["verification_errors"] = Validate_rules(reservation_details);//this function return List&lt;string[]&gt; return RedirectToAction("Index", "Home"); }的问题
  • 重定向到主视图控制器
  • 您要重定向到哪个控制器操作?
【解决方案2】:

看起来这个问题是一个复合问题,需要进行一些分解:

  1. 控制器重定向到一个动作,所以它肯定应该是:

    return RedirectToAction ("YourAnotherAction", "YourAnotherController");
    

我找不到您尝试重定向到的Home Controller 的操作。您想避免 Home ControllerIndex 操作,但不要定义您要查看的确切操作。

  1. 尝试发送一些其他数据并检查所有路由是否正常。只需检查您是否正在检查相同的区域、项目等。

  2. 只要检查TempData是否为空。

最后,Ashkan Mobayen Khiabani 提供了一个很好的建议,检查一下。什么问题仍然存在?他建议重定向到其他一些操作 - 尝试一下。 希望对您有所帮助。

【讨论】:

  • 如果您不喜欢我所做的更改以通过拒绝它们来改进您的答案,请不要将它们作为您自己的内容发布,因为这称为抄袭。此外,使用tour 可能是一个好主意,因为它显示了 Stack Overflow 与留言板的不同之处以及为什么您的添加更适合作为 Ashkan Mobayen Khiabani 答案的支持。
  • @scopchanov,不明白你对变化和抄袭的看法。我没有拒绝任何改变。抱歉,如果我将您的一些更改发布为我自己的更改(您的意思是计数,我想?)。此外,我仍然无法投票赞成任何答案,而且我提出的答案似乎更广泛。无论如何,谢谢你的回复。
  • 我的意思是我的整个编辑都在那里,格式等等。
【解决方案3】:

您可以通过使用路径来判断要加载哪个视图:

public ActionResult BookReservation()
{
     return View("Home/Index");
}

你甚至可以这样做:

public ActionResult SomeAction()
{
      if(SomeValue)
      return View();
      else 
      return View("Errors/AccessDenied");
}

【讨论】:

  • 我还是有同样的问题
【解决方案4】:

TempData 仅保留两个后续请求的信息,通常用于在控制器之间传递数据(重定向)。您可以使用ViewBag 将值传递到视图中:

控制器

public ActionResult Validate_Data(ReservationDetails reservation_details)
{
    TempData["verification_errors"] = Validate_rules(reservation_details);//this function return List<string[]>  

    return RedirectToAction("Index");
}

public ActionResult Index()
{
    var verification_errors = TempData["verification_errors"];
    ViewBag.Errors = verification_errors;

    // do something

    return View();
}

查看

@{
     List<string[]> validate_rules = new List<string[]>();
     if (ViewBag.Errors != null)
     {
         validate_rules = (List<string[]>)ViewBag.Errors;
     }
}                   

@foreach (var item in validate_rules)
{                        
     <label>@item[0].ToString() @item[2].ToString()</label>
}

或者干脆使用TempData.Keep在返回视图之前保留内容:

public ActionResult Index()
{
    TempData.Keep("verification_errors");

    // do something

    return View();
}

参考资料:

TempData value not persisting if used in view

Losing data from viewbag/tempdata after multiple post

【讨论】:

  • 那你有什么问题? TempData 还是空的还是那里发生了其他问题?我认为TempData.Keep在返回视图时可以维持存储的数据。
  • tempdata 不为空我的问题是我无法在浏览器中显示列表的项目列表包含所有元素
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2018-02-11
相关资源
最近更新 更多