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,什么被认为是正确的方法。
如果第二个选项是"适当的"解决方案,我该如何将数据发送到备用控制器操作?
您可以执行以下操作,即将表单值作为路由值传递:
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"的论点现在已经没有实际意义了,因为绝大多数现代网站都依赖于它。