我有一个MVC应用程序,当点击链接时,需要根据另一页面上的相同值显示页面。我无法弄清楚为什么传递的是null而不是字符串。我的代码如下。
控制器:
public string searchQ
{
get { return (string)Session["searchQ"]; }
set { Session["searchQ"] = value; }
}
public ActionResult Index()
{
Session["InitialLoad"] = "Yes";
return View();
}
[HttpPost]
public ActionResult Index(string heatSearch)
{
ViewBag.SearchKey = heatSearch;
searchQ = heatSearch;
return View();
}
public ActionResult Index_Perm()
{
ViewBag.SearchKey = searchQ;
return View();
}
public ActionResult PartialMainLim(string heatSearch)
{
HomeModel C = new HomeModel();
ChemViewModel D = new ChemViewModel();
D = C.QueryResults(heatSearch);
return PartialView(D);
}
public ActionResult PartialMain(string heatSearch)
{
HomeModel C = new HomeModel();
ChemViewModel D = new ChemViewModel();
D = C.QueryResults(heatSearch);
return PartialView(D);
}
索引视图中的代码如下所示(这个有效):
@if (ViewBag.SearchKey != null)
{
<div>
@Html.Action("PartialMainLim", "Home", (string)ViewBag.SearchKey)
</div>
}
在index_perm视图中:
@if(ViewBag.SearchKey != null)
{
<div>
@Html.Action("PartialMain", "Home", (string)ViewBag.SearchKey)
</div>
}
当我在两个视图中检查SearchKey的值时,它是正确的。但是,对于方法“PartialMain”,只要SearchKey正确,就会传递null而不是字符串。这一切都适用于其他视图。我做错了什么?
答案 0 :(得分:2)
将值传递回控制器时,基本上有两个选项:
制作表格
将其作为网址的一部分传递
获取方法只接受url属性,而Post方法也能够处理表单内容。
根据你的目的,我会说你可以使用类似的东西:
@Html.Action("PartialMain", "Home", new {heatSearch = (string)ViewBag.SearchKey})
这应该创建看起来像/ Home / PartialMain的网址?heatSearch = [SearchKey的内容]
编辑:
只会传递ViewBag中存在的值。你是从Session中得到的,这在MVC中是一个很糟糕的想法(应该是无会话的)。请考虑一下你是否真的需要它。通常还有其他方法可以实现这一点。
答案 1 :(得分:0)
单击index_perm视图时,控制器中没有HttpPost处理程序。
答案 2 :(得分:0)
我认为问题是你的会话是空的。框架原理之一ASP.NET MVC是无状态的。在ASP.NET MVC中使用会话非常可怕。
目前,我认为您可以使用默认使用Session的 TempData 快速修复它。您可以查看过时的文章,以便进一步挖掘ViewData vs TempData