我将模型从一个控制器方法传递到另一个控制器方法,以将所有值收集到模型字段。我正在做如下所示
[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的人能帮助我。 提前谢谢。
答案 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);
}