值未从视图正确传递给控制器

时间:2013-04-19 00:12:36

标签: c# asp.net-mvc razor

我有一个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而不是字符串。这一切都适用于其他视图。我做错了什么?

3 个答案:

答案 0 :(得分:2)

将值传递回控制器时,基本上有两个选项:

  1. 制作表格

  2. 将其作为网址的一部分传递

  3. 获取方法只接受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