我有一个用于上传在许多 View 中使用的图像的操作方法。上传图像后,我希望我的方法重定向到相同的 View 。为此,我需要操作名称来重定向它,当我尝试通过以下方式获取操作名称时:
var routeValues = HttpContext.Request.RequestContext.RouteData.Values;
if (routeValues != null)
{
if (routeValues.ContainsKey("action"))
{
var actionName = routeValues["action"].ToString();
}
}
它给出当前发布的操作名称即:
public ActionResult UploadImage(HttpPostedFileBase imageUpload,
PatientHomeViewModel model)
这是提交时 View 中的表单:
@using (Html.BeginForm("UploadImage", "Patient", FormMethod.Post,
new { enctype = "multipart/form-data" }))
此表单用于许多不同的 View ,我需要这些 View 的操作名称进行重定向。无论我尝试过什么,我都只得到了当前的操作名称。
最佳答案
您始终可以使用 jquery ajax 或 javascript fetch 将表单发送到 Controller ,在操作中您不返回任何 View ,还有一个好处是 View 不会被重新加载,这是一个很好的例子:
https://www.aspsnippets.com/Articles/ASPNet-Core-Submit-Form-using-jQuery.aspx
Controller :
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public JsonResult Index(string firstName, string lastName)
{
string name = string.Format("Name: {0} {1}", firstName, lastName); ;
return Json(new { Status = "success", Name = name });
}
}
表格:
<form id="myForm" method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="Index">
<table>
<tr>
<td>First Name: </td>
<td><input type="text" id="txtFirstName"/></td>
</tr>
<tr>
<td>Last Name: </td>
<td><input type="text" id="txtLastName"/></td>
</tr>
<tr>
<td></td>
<td><input type="button" value="Submit" onclick="AjaxFormSubmit()"/></td>
</tr>
</table>
<hr/>
<span id="lblName"></span>
</form>
脚本:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
function AjaxFormSubmit() {
//Set the URL.
var url = $("#myForm").attr("action");
//Add the Field values to FormData object.
var formData = new FormData();
formData.append("firstName", $("#txtFirstName").val());
formData.append("lastName", $("#txtLastName").val());
$.ajax({
type: 'POST',
url: url,
data: formData,
processData: false,
contentType: false
}).done(function (response) {
if (response.Status === "success") {
$("#lblName").html(response.Name);
}
});
}
</script>
请注意,该示例返回 JsonResult
,但您仍然可以使用 IActionResult
返回类型并返回 Ok()
、BadRequest()
等,你也可以有一个带有属性的对象作为 Controller 的参数,只要属性名称与jquery Formdata
名称匹配,映射就是自动的。
还有其他选择,您可以在这里查看 How to get view name in controller while navigating from view to controller in MVC3或这里Retrieve the current view name in ASP.NET MVC? ,您还可以使用 View 中的硬编码 View 名称组合 ViewData
或 TempData
,并在 Controller 中访问它,尽管我仍然认为使用 javascript 是更好的选择,因为您已经加载了 View 。
如果您要重定向到另一个操作,JavaScript 就会失去其目的,即您不必重新加载 View ,因此我建议使用其他选项之一。
关于c# - 提交表单时如何获取当前 View 的操作名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73741461/