1

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

[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”。但它显示了控制器方法“B”的视图所以,我对这个问题感到困惑。而且我在方法“B”的httppost中看不到(l,k)的值。这是什么原因。

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

4

4 回答 4

7

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

return B(m);
于 2012-08-22T05:50:19.253 回答
2

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

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

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

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

于 2012-08-22T06:47:17.707 回答
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);
}
于 2012-08-22T06:33:56.357 回答
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);
    }
于 2012-08-24T11:19:48.943 回答