c# - 提交表单时如何获取当前 View 的操作名称?

标签 c# asp.net-mvc model-view-controller razor asp.net-mvc-routing

我有一个用于上传在许多 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 名称组合 ViewDataTempData ,并在 Controller 中访问它,尽管我仍然认为使用 javascript 是更好的选择,因为您已经加载了 View 。

如果您要重定向到另一个操作,JavaScript 就会失去其目的,即您不必重新加载 View ,因此我建议使用其他选项之一。

关于c# - 提交表单时如何获取当前 View 的操作名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73741461/

相关文章:

c# - 如何根据字符串键(序列键)验证登录用户以在 asp.net mvc 中执行某些特定操作?

java - 如何在不保持 View 存活的情况下实现 MVC 模式

ios - Swift Model 对象应该调用 API 吗?

javascript - 在打开文件对话框中禁用拖放功能

c# - 我可以强制子类重写一个方法而不使它抽象吗?

asp.net-mvc - MVC RadioButtonFor 为每个元素输出相同的 ID

ajax - 无法在 MVC 中传递与号和哈希符号

c# - 使用 mvc 路由约束,因此 url 只能映射到三个可能的参数之一

c# - WPF 命名空间混淆

c# - 每次我重新加载项目时,统一的 Csproj 文件都会更改