【发布时间】:2019-09-18 04:32:06
【问题描述】:
我有一种情况,根据不同的客户端呈现不同的 GET 视图。但是所有这些 Get 视图都在对同一端点进行 POST。我想知道哪个视图正在执行 POST,以便在出现错误时渲染调用视图?
【问题讨论】:
-
你可以将它作为参数传递..
-
如何通过?能举个例子吗?
标签: c# asp.net-mvc-5
我有一种情况,根据不同的客户端呈现不同的 GET 视图。但是所有这些 Get 视图都在对同一端点进行 POST。我想知道哪个视图正在执行 POST,以便在出现错误时渲染调用视图?
【问题讨论】:
标签: c# asp.net-mvc-5
将隐藏的输入属性添加到视图所基于的模型:
[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" />
【讨论】:
ViewBag 在控制器中设置它,但模型更好。请参阅我的更新答案。
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的信息
【讨论】: