我在这里看到了很多这个问题,但我的问题略有不同。我已经有两个由MVC开箱即用的创建动作,如此列出(一个是GET,一个是POST):
public ActionResult Create()
{
//stuff...
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include="WeeklyTargetId,UserId,WeekId,Hours")] WeeklyTarget weeklytarget)
{
//stuff...
}
我的问题是我正在尝试根据DropDown更新创建视图,该DropDown已添加到包含在其自己的表单中的页面上,在提交时用户可以过滤主Create表单上的另一个下拉列表。这是我在Create视图中单独包装的表单:
@using (Html.BeginForm())
{
<p>
<span>
Filter By Practice:
@Html.DropDownList("Practice", (List<SelectListItem>) ViewBag.PracticeList, new { @onchange = "this.form.submit();"})
</span>
</p>
}
我的理由是,当用户选择要过滤的练习时,onchange事件将提交表单并启动我已注销的新动作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection formCollection)
{
//do the filtering stuff...
}
然而,正如我已经意识到MVC没有查看方法签名来覆盖歧义,并且只能有两个Create动作。我有什么选择?我完全错了吗?有没有办法让过滤器表单提交路由到一个不同的动作名称而不是Create?请记住,这一切都在创建视图上,之后我会回到这里。非常感谢任何帮助,谢谢!
答案 0 :(得分:2)
通过BeginForm
方法创建表单时,您可以指定操作和控制器。
Html.BeginForm("FilterAction", "ControllerName")
然后在动作中,你可以通过ViewBag过滤你的模型在你的SelectList中的任何内容。
可在此处找到更多信息: