【问题标题】:In an MVC view, what controller and method is called if none is specified in the form tag?在 MVC 视图中,如果表单标签中没有指定控制器和方法,则调用什么控制器和方法?
【发布时间】:2026-02-14 09:35:02
【问题描述】:

我有一个我继承的 MVC 项目。在视图中,BeginForm 标记中没有指定路由(控制器和操作)。视图正确呈现,所以我认为它正在选择默认路由。

我的问题是,如果未指定路线,它如何知道使用哪条路线?这里的最佳做法是什么:您应该指定路由还是让它默认?

所以视图是 Views/Config/WorkCodes.cshtml 而标签是

Html.BeginForm()

它转到控制器 ConfigController.cs 并调用操作 WorkCodes()。如果我在做这个项目,我会写

Html.BeginForm("WorkCodes", "Config", FormMethod.Post)

MVC 如何知道不指定使用哪个控制器和动作?

WorkCodes.cshtml

@{
  ViewBag.Title = "Work Codes";
}

@using (Html.BeginForm())
{
<div>
    <table style="width: 100%;" class="trHoverHighlight">
        <tbody>
            <tr>
                <td>
                    <br />
                    <div>
                        <button id="buttonCreateNew" type="button">Add New</button>&nbsp;
                        <button id="buttonReturn" type="button">Return</button>
                    </div>

                </td>
            </tr>
        </tbody>
    </table>
</div>

}

ConfigController.cs

    public ActionResult WorkCodes()
    {
        return View(Rep.GetWorkAll(true));
    }

这里是在另一个视图中调用视图的地方:

                @foreach (var itm in (List<string>)ViewBag.ListObjects)
                {
                        <li>
                            <a href="../Config/@itm">Work Codes</a>
                        </li>  
                }

【问题讨论】:

  • 默认的FormMethodFormMethod.Post,默认的控制器和动作名称是生成视图的名称(通过GET方法)

标签: asp.net-mvc asp.net-mvc-4 razor html-helper


【解决方案1】:

视图是通过执行HTTP GETWorkCodes 控制器动作生成的,因此默认情况下,在该视图中生成的表单对同名的控制器动作执行HTTP POST

Here's the MSDN docs.

BeginForm(HtmlHelper) 将开始标记写入响应。 表单使用 POST 方法,请求由 视图的操作方法。

【讨论】:

  • 那么最佳实践是什么?指定路由还是不指定路由?
  • 不指定值意味着更少的代码,并且意味着在为动作和控制器名称输入魔术字符串时不能打错字
  • 如果你没有在已经映射到视图的默认位置(控制器\动作)以外的地方进行路由,通常人们不会指定它。有时您可能希望在给定帖子上路由到不同的控制器/动作,此时专门添加路由是合适的。
最近更新 更多