MVC4 根据用户选择动态更改表单的操作

本文关键字:表单 操作 动态 用户 选择 MVC4 | 更新日期: 2023-09-27 18:32:01

我需要根据用户在表单内的下拉框中所做的选择来更改表单的操作,我在 .NET 4.5 上有一个 MVC4/C# 项目

用户所做的选择将影响需要调用哪个控制器或哪个操作。

我已经做了一些搜索,我得出了一些解决方案:

  • 实现 JQuery 客户端以动态更改表单的操作
  • 让表单转到专用于将请求路由到正确的控制器/操作的特定操作

从我所读到的内容来看,人们建议不要使用JQuery,因为您无法确定客户端是否正在运行javascript,以及类似的问题。

我一直

在这里玩我的第二个选项,我一直在尝试使用RedirectToAction在交换机块内执行路由,但是它不适用于 POST 数据,因为重定向会导致 GET。

我在控制器中尝试的示例如下:

    [HttpPost]
    public ActionResult Index(TestObject object)
    {
        switch (object.Type) {
            case("A"):
                return RedirectToAction("ActionA");
            case ("B"):
                return RedirectToAction("ActionB");
            case ("C"):
                return RedirectToAction("ActionC");
            default:
                ModelState.AddModelError("", "Invalid Type");
                return View();
        }
    }
    [HttpPost]
    public ActionResult ActionA(TestObject object)
    {
            // Do Stuff for ActionA
            return View();
    }

这是我创建的第一个 MVC 项目,所以我想知道如果每个人都一直说不要在这种情况中使用 JQuery,什么被认为是正确的方法。

如果第二个选项是"适当的"解决方案,我该如何将数据发送到备用控制器操作?

MVC4 根据用户选择动态更改表单的操作

您可以执行以下操作,即将表单值作为路由值传递:

RedirectToAction("ACTIONNAME", "CONTROLLERNAME", ROUTEVALUES);

例如

this.RedirectToAction("displayimport", "coilenquiry", new { Number = number });

然后在您的操作中,使用参数...

    public ActionResult DisplayImport(string Number)
    {
    }

目前没有任何方法可以将模型直接传递给RedirectToAction。这就是TempData的用途:

TempData["MyModel"] = model;
switch (object.Type) {
    case("A"):
        return RedirectToAction("ActionA");
    case ("B"):
        return RedirectToAction("ActionB");
    case ("C"):
        return RedirectToAction("ActionC");
    default:
        ModelState.AddModelError("", "Invalid Type");
        return View();
}

在您的下一个操作中(请注意,这将是一个 GET 请求,因此您需要从中删除HttpPost注释):

var model = TempData["MyModel"] as TestObject;
但是,我

非常喜欢尽可能避免会话存储,因此,在这种情况下,我不一定说使用jQuery没有任何优点。"你可以关闭JavaScript"的论点现在已经没有实际意义了,因为绝大多数现代网站都依赖于它。