将模型从一个控制器传递到MVC3中的另一个控制器不起作用

时间:2012-08-22 05:44:59

标签: c# asp.net asp.net-mvc-3

我将模型从一个控制器方法传递到另一个控制器方法,以将所有值收集到模型字段。我正在做如下所示

[HttpPost]
    public ActionResult A(Model m, string s)
    {
        if (ModelState.IsValid) 
        {
            if (m.l == null || m.k == null)
            {
                //Do something.

            }
            else
                return View("B", m); // this is where by debug point comes...
        }

        return View(m);


    }


public ActionResult B(Model m)
    {

        return View(m);
    }

[HttpPost]
    public ActionResult B(Model m, string s)
    {
        if (ModelState.IsValid)
        {
            if (m.p == null || m.j == null)
            {
                //do something
            }
            else
            {
               // do something and redirect to somewhere else 
            }


        }

但正如我所示,调试点如下所示。

return View("B", m);

这应该触及Controller方法“B”但是问题是它没有击中控制器方法“B”。但它显示了Controller方法“B”的视图所以,我对此问题感到困惑。而且我在方法“B”的httppost中看不到(l,k)的值。这是什么原因。

我想知道,我这样做是对还是错。如果我这样做错了,请你解释一下。擅长MVC的人能帮助我。 提前谢谢。

4 个答案:

答案 0 :(得分:7)

该代码 - return View("B", m) - 实际上不会重定向到操作 B,它只是使用给定的模型呈现视图 B.如果要执行操作,则应使用:

return B(m);

答案 1 :(得分:2)

您不应该通过其他操作调用操作。在执行控制器动作方法(前一个)之后执行视图RESULT。不打算从另一个人那里调用动作,并且可以提供到同一动作方法的多个路径。您的控制器目的是编排数据。如果您认为应该调用多个方法,那么您应该将它们拆分为其他Facade类或服务层类,每个需要它的控制器都会请求它或将此信息聚合到一个域对象中,然后从

如果其中任何一项不清楚,我会进一步澄清。

调用多个存储库方法来获取数据并填充到视图模型中 要么 使用父视图并从视图中调用RenderAction以发出其他控制器数据

或者使用RenderPartial将父视图对象传递给每个子视图以呈现它的部分,但我更喜欢RenderAction,除非所有数据都可用于顶级视图的视图模型。 要么 从控制器调用外观层类,然后从各个位置获取数据,执行xyz并将其返回给控制器,然后控制器从该数据中填充视图模型。

答案 2 :(得分:1)

尝试这样的事情,

[HttpPost]
public ActionResult A(Model m, string s)
{
    if (ModelState.IsValid) 
    {
        if (m.l == null || m.k == null)
        {
            //Do something.                    
        }
        else
            RedirectToAction("B", m); // check this
    }
    return View(m);    
}   

public ActionResult B(Model model)
{
    return View(model);
}

答案 3 :(得分:1)

  

尝试以下代码。它应该工作。这是@dbaseman

答案的替代方案
    [HttpPost]
    public ActionResult A(Model m, string s)
    {
        if (ModelState.IsValid) 
        {
            if (m.l == null || m.k == null)
            {
                //Do something.                    
            }
            else
            {
                TempData["tempModel"]=m; //cannot pass a model in a redirect method. so store it in a tempdata object.
                return RedirectToAction("B"); // redirect to action method B
            }
        }
        return View(m);    
    }   

    public ActionResult B()
    {
        Model model= new Model();
        if(TempData["tempModel"]!=null)
            model=(Model)TempData["tempModel"];
        return View(model);
    }