“如果标题有误导性,请随时进行编辑,因为我不确定这是否是正确的提问方式”
我是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);
}
有没有这样做的地方?
答案 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的思想是包含仅对下一个请求有用的数据。考虑验证消息和此类数据。