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

时间:2013-09-19 10:00:43

标签: c# asp.net asp.net-mvc asp.net-mvc-4

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

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

我已经做了一些搜索,我已经找到了一些解决方案:

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

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

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

我在控制器内尝试的一个例子如下:

    [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,那么正确的方法是什么。

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

2 个答案:

答案 0 :(得分: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”这一说法是非常没有意义的。

答案 1 :(得分:2)

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

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

e.g。

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

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

    public ActionResult DisplayImport(string Number)
    {

    }