1

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

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

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

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

根据我的阅读,人们建议不要使用 JQuery,因为您不能确定客户端正在运行 javascript,以及类似的问题。

我一直在玩我的第二个选项,我一直在尝试使用RedirectToAction在 switch 块内执行路由,但是它不适用于 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,那么什么才是正确的方法。

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

4

2 回答 2

2

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

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

例如

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

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

    public ActionResult DisplayImport(string Number)
    {

    }
于 2013-09-19T10:11:14.983 回答
2

目前没有任何方法可以直接将模型传递给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”的论点如今已经毫无意义。

于 2013-09-19T10:06:59.357 回答