控制器类型'WeeklyTargetController'上的当前动作'Create'请求在以下操作方法之间是不明确的:

时间:2014-02-25 16:07:25

标签: c# asp.net-mvc razor

我在这里看到了很多这个问题,但我的问题略有不同。我已经有两个由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?请记住,这一切都在创建视图上,之后我会回到这里。非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:2)

通过BeginForm方法创建表单时,您可以指定操作和控制器。

Html.BeginForm("FilterAction", "ControllerName")

然后在动作中,你可以通过ViewBag过滤你的模型在你的SelectList中的任何内容。

可在此处找到更多信息:

FormExtensions.BeginForm Method