繁体   English   中英

无法将模型从一个控制器传递到MVC3中的另一个控制器

[英]Passing an model from one controller to another controller in MVC3 not working

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

[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);

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

我想知道,我这样做是对还是错。 如果我做错了,可以请您对此做些解释。 擅长MVC的人可以帮助我。 提前致谢。

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

return B(m);

您不应从另一个动作中调用一个动作。 视图RESULT在执行控制器的操作方法(最上面的一种)之后执行。 从另一个调用动作是不希望的,它可以为同一动作方法提供多种途径。 控制器的目的是编排数据。 如果您认为应调用多个方法,则应将其分解为其他外观类或服务层类,每个需要它的控制器将请求该方法或将这些信息聚合到一个域对象中,然后从中填充视图模型

如果不清楚,我将进一步澄清。

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

或使用RenderPartial来使用父视图对象传递给每个子视图以渲染其子部分,但我更喜欢RenderAction,除非所有数据对顶级视图的视图模型都有意义。 或从您的控制器中调用Facade图层类,该类又从各个位置获取数据,执行xyz并将其返回给控制器,然后由该控制器填充该视图模型。

试试这个

[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);
}

试试下面的代码。 它应该工作。 这是@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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM