ASP.MVC:从另一个控制器访问控制器中的数据

时间:2019-03-01 19:10:16

标签: c# asp.net-mvc

“如果标题有误导性,请随时进行编辑,因为我不确定这是否是正确的提问方式”

我是ASP.MVC的新手,我遇到了一个看似简单的问题,并且很难解决。

我要做什么:我有两组支架:View A,控制器A,模型B。和View B,控制器B,模型B。

控制器A 如下:

 public ActionResult LogIn(FormCollection formValues)
        {
            ModelA Model = new ModelA();
            Model.EmailAddress = formValues["EmailAddress"];
        }

我想将此formValues["EmailAddress"]从控制器A传递到控制器B。

在控制器B中:

    public ActionResult Initiate(FormCollection formValues, string phone, string method)
    {
        var ModelB = new ModelB();
        var ModelA = new ModelA(); ---> This is null.
        ModelB.Email = ModelA.EmailAddress --> This is null.
        var userId = ModelB.dosomething(ModelB.Email, phone, method);
    }

有没有这样做的地方?

3 个答案:

答案 0 :(得分:1)

像这样将模型保存在Controller A的TempData中

com.docke 28032 me   22u  IPv4 0x2b3b4a41c30a8773      0t0  TCP *:54000 (LISTEN)

然后您可以像这样在控制器B中对其进行访问

ModelA Model = new ModelA();
Model.EmailAddress = formValues["EmailAddress"];
TempData["ModelA"]=Model;

但是TempData的寿命很短,不能在后续请求中使用 要使TempData持久保存为后续请求,您可以使用

ModelA modelA= TempData["ModelA"] as ModelA;

答案 1 :(得分:1)

如果ModelA和ModelB的逻辑要交织在一起,我建议创建一个新的ViewModel,View和Controller:

ModelAB

public class AB {
    public ModelA ModelA { get; set; }
    public ModelB ModelB { get; set; }
}

ModelABController

public ActionResult LogInAndInitiate(FormCollection formValues, string phone, string method)
{
    var ModelB = new ModelB();
    var ModelA = new ModelA(); // passed in, so its not null!
    ModelA.EmailAddress = formValues["EmailAddress"];

    ModelB.Email = ModelA.EmailAddress // passed in too!
    var userId = ModelB.dosomething(ModelB.Email, phone, method);
}

答案 2 :(得分:1)

如果控制器的动作是完全不相关的(即它们不会相互调用),则有两种选择:

1)将数据呈现给客户端,使其成为表单,并在下一个请求中将其重新发布。当然,这仅适用于少量数据,并且如果您确定用户不小心篡改数据既不敏感也不成问题。

2)使用会话。这就是会话的用途,即购物车中的内容等。您可以选择将此数据保存在数据库中,或仅将其存储在内存中的会话对象中。

我不建议为此使用TempData,因为TempData的思想是包含仅对下一个请求有用的数据。考虑验证消息和此类数据。