如何临时转到另一个视图来创建实体
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