如何临时转到另一个视图来创建实体

Posted

技术标签:

【中文标题】如何临时转到另一个视图来创建实体【英文标题】:How can I temp go to another view to create entities 【发布时间】:2010-07-12 04:36:45 【问题描述】:

我是 asp.net MVC 的新手,我必须决定如何实现以下内容。谁能指出我正确的方向

我有一个控制器,它提供一个视图来创建一切正常的客户

我有另一个控制器,用于创建发票。但是要创建发票,我需要搜索一切正常的客户。如果我找不到客户,我将需要为创建客户视图提供服务,创建客户,然后返回到我的发票创建。

所以我的问题是如何从我的发票控制器让客户控制器创建客户,取回客户详细信息并将详细信息插入我的发票视图。

这些控制器/视图位于不同的区域

【问题讨论】:

【参考方案1】:

请记住,控制器服务于特定请求(获取客户、查看客户、创建发票)。

在您的情况下,您不需要“让客户控制器创建客户”。

例如,只需创建一个名为“GetCustomer”的常规方法。这可以从多个控制器调用。这个方法可以存在于任何地方——也许在你的模型命名空间中的一个助手程序集中(假设你的模型在一个单独的类库中,这就是我所做的)。只需从您的 Invoice 控制器调用。

你不想在控制器之间来回移动——这违背了 MVC 的原则。

应该是

URL Request -> Controller -> Model -> Controller -> View.

不是

URL Request -> Controller -> Controller -> Model -> Controller -> View.

这就是我的意思。

客户控制器:

public ActionResult Index(int customerId)

   var customer = Model.GetCustomerById(customerId);
   return View(customer);

发票控制器:

public ActionResult GetInvoice(int customerId)

   var customer = Model.GetCustomerById(customerId);
   return View("Invoice", customer);

型号:

public Customer GetCustomerById(int customerId)

    var customer = yourDatabaseRepository.GetCustomerById(customerId);

知道我的意思吗?关键是不要将“GetCustomer”逻辑放在控制器中 - 将其抽象到模型中 - 可供所有控制器访问。

【讨论】:

【参考方案2】:

在我回答您的技术问题之前,请考虑一下发票页面的流程。我想您想要为客户提供某种搜索框。如果未找到客户,您要求自动重定向到不同的控制器,创建客户,然后返回发票页面。您最好提醒用户未找到客户,并为他们提供创建客户的选项(他们可能拼错了名称等)。否则,您最终会出现重复的客户,每个客户都附有不同的发票。

然后您可以使用以下内容重定向用户(注意我包含了返回 url 和客户名称),您的客户控制器可以接受这些参数并预填充名称字段以及重定向回:

RedirectToAction("Create", "Customer", new returnUrl = "YourUrl", NewCustomerName = "NewCustNameHere"

如果您确实想自动执行此操作,我会按照 RPM 建议的方法执行此操作。

【讨论】:

我应该添加重定向,我假设您需要为客户输入其他信息,例如地址等。所以我只是预先填充我们已经知道的信息并提供返回 url重新提交客户表单后。

以上是关于如何临时转到另一个视图来创建实体的主要内容,如果未能解决你的问题,请参考以下文章

我如何创建(临时?)存储过程来帮助制作摘要视图?

带有“ 307临时重定向”的Android VideoView播放URL

SQL 使用临时表创建视图

MS Access 数据库 (2010) 如何从查询设计器创建临时表/过程/视图

如何在情节提要中从一个视图转到另一个视图

如何在nginx创建临时重定向和永久重定向