【问题标题】:How to get name of view from actionmethod in mvc5?如何从 mvc 5 中的操作方法获取视图名称?
【发布时间】:2019-09-18 04:32:06
【问题描述】:

我有一种情况,根据不同的客户端呈现不同的 GET 视图。但是所有这些 Get 视图都在对同一端点进行 POST。我想知道哪个视图正在执行 POST,以便在出现错误时渲染调用视图?

【问题讨论】:

  • 你可以将它作为参数传递..
  • 如何通过?能举个例子吗?

标签: c# asp.net-mvc-5


【解决方案1】:

将隐藏的输入属性添加到视图所基于的模型:

[HiddenInput]
public string Client { get; set; }

然后在所有视图中将其添加到表单的开头:

@Html.HiddenFor(m => m.Client)

现在,在控制器中,您可以在 GET 操作中构建模型时将客户端值分配给 Client 属性,并检查它以在您的 POST 操作中做出您想要做出的决定。

更新如果您不想为模型添加额外的属性,可以使用ViewBag 来保存该值(尽管上面的模型解决方案更好)。在控制器中,您可以在GET 操作中分配客户端值:

ViewBag.Client = client;

然后在所有视图中将其添加到表单的开头:

<input type="hidden" name="Client" value="@ViewBag.Client" />

然后在POST 操作中检查您想要做出的决定。由于它不属于您的模型,因此您必须单独获取它:

public IActionResult PostAction(MyModel mode, string client) {
  switch(client) {
  //...
  }
}

注意:上述方法允许您对多个客户端使用相同的视图,本质上允许您创建一种客户端组或类型。但是如果您实际上对每个客户端都有不同的视图,那么您不需要通过ViewBag 传递值,您可以直接在每个视图中对其进行硬编码:

<input type="hidden" name="Client" value="Client1" />

【讨论】:

  • 我喜欢您的解决方案,但我不想为模型添加额外的属性。有没有办法像我们可以从 HttpContext 或 Request 或其他东西获取视图名称?
  • 您不必将其添加到模型中,但是您必须直接在视图中设置值。您仍然可以使用ViewBag 在控制器中设置它,但模型更好。请参阅我的更新答案。
【解决方案2】:

HttpRequest 对象上的 HttpMethod 属性将为您获取它。您可以在控制器中使用它:

using System.Net.Http;

if (HttpContext.Request.HttpMethod == HttpMethod.Post.Method)
 {
 // The action is a post method
 }

如果您想查找哪个View 调用了操作方法,您可以在Url.Action 中使用以下内容:

@Path.GetFileNameWithoutExtension(Server.MapPath(VirtualPath))

一个示例调用可能是:

@Url.Action("Action","Controller",new{callingView=Path.GetFileNameWithoutExtension(Server.MapPath(VirtualPath))})

您需要在控制器方法中添加一个参数:

public ActionResult Action(MyModel model, string callingView)

你可以阅读更多关于@VirtualPathhere的信息

【讨论】:

  • 我想获取正在执行 POST 到 actionmethod 的视图名称。就像 client1.cshtml 或 client2.cshtml 正在做 POST 到同一个端点。所以我想知道 Post 是由 client1 还是 client2 发起的。
  • @BishwaKhatri 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多