2

我是 MVC 环境的新手,我正在研究在 VS 2010 中创建的 MVC3 示例应用程序(文件 -> 新建 -> 项目 -> MVC3 Web 应用程序)。

此应用程序在网页右上角有一个“登录”链接。单击登录页面会显示一个页面,其中包含您的基本用户 ID 和密码文本字段以及一个提交按钮。

在LogOn.cshtml页面中,提交按钮的html代码为:

    <p>
        <input type="submit" value="Log On" />
    </p>  

在 AccountController.cs 页面上,public ActionResult LogOn(LogOnModel model, string returnUrl)函数被调用。

问题:提交按钮如何知道要调用 AccountController.cs 上的哪个函数?

我的困惑是由于在 aspx 页面中可能有一个 Button.OnClick 方法,它告诉按钮要执行什么功能。

4

4 回答 4

2

通过路由引擎。该应用程序将具有类似于

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
  "Default", // Route name
  "{controller}/{action}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

在这种情况下,表单使用的操作本质上是 /Account/LogOn。查看主要路线,这将转换为控制器 =“帐户”和操作 =“登录”。

这是机制的鸟瞰图。ASPNET MVC站点有一系列很棒的教程来描述 MVC 的基础知识。

编辑

在 HTML 中,提交按钮用于将表单数据发送到服务器。数据被发送到表单的 action 属性中指定的页面。action 属性中定义的文件通常对接收到的输入做一些事情:

html代码

<input type="submit" value="Log On" />

将被包裹在cshtml页面中的一个form标签中

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) {
   //html here
}

在浏览器中呈现时,表单标签看起来像

<form action="/Account/Logon" class="form-horizontal well" method="post" novalidate="novalidate">
<input id="ReturnUrl" name="ReturnUrl" type="hidden" value="/"> 
<!-- other HTML elements here -->
<input type="submit" value="Log On" />     
</form>

因此,当单击提交按钮时,表单被发布(HTTP Verb POST)到表单标签的 action 属性中的 url。在这种情况下/帐户/登录。

更多信息可以在W3C 表单推荐中阅读

从 WebForms 到 MVC 的最大一步是 WebForms 从开发人员那里抽象出很多底层 HTML 规范。

于 2013-01-15T02:59:00.633 回答
0

单击 mvc 中的提交按钮时,表单将被提交给在我们的表单动作属性中定义的动作。如果表单中未定义操作,它将提交表单到相同的操作名称,它来自哪个过滤器是 [Httppost]

于 2013-01-15T05:16:39.990 回答
0

嗨,我会给你一个像下面这样的例子

在您的控制器中,您有 2 种操作方法,例如(在示例中,我有国家控制器)

(1) 

            [HttpGet]
            public ActionResult Create()
            {
                return View();
            }
(2)
        [HttpPost]
        public ActionResult Create(Country country)
        {
            if (ModelState.IsValid)
            {

                CountryRepository.InsertOrUpdate(country);
                CountryRepository.Save();                    
                 return RedirectToAction("Index");
            }

            return View(country);
        }

在 asp.net web 表单中,您正在使用页面加载功能。在 mvc [HttpGet] Create Action 中,您使用的方式与页面加载功能相同。

在你看来

@using (Html.BeginForm("Create", "Country", FormMethod.Post))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Country</legend>
        @Html.Partial("_CoutnryAddOrEdit", Model)
        <p>
            <input type="submit" value="Create" id="btnSave" />
        </p>
        <br />
        <p>
            <input type="submit" value="GetData" id="btnGetData" />
        </p>
    </fieldset>
}

在 Html.BeginForm 函数中有不同的参数。在该函数中,您传递参数值,例如第一个参数是您的“动作名称”,第二个是“控制器名称”,第三个是“您的 FormMethod,如 GET 或 POST”

1) Get=> Get 方法在您的页面 Lode 时调用

2) POST => 单击按钮后调用的 Post 方法。

所以你的 Html.BeginForm 看起来像这样 Html.BeginForm("Create","Country",FormMethod.Post)。

因此,在单击您不会执行任何操作的按钮后,您将所有代码都写在 Post Method 上。

我想这会对你有所帮助。

于 2013-01-15T05:33:57.803 回答
-1

我建议您使用 jquery 处理 ajax 帖子来处理按钮单击事件。试试下面的方法。

  <input type="button" value="Button 1" class='button1' />

[脚本]

 <script type="text/javascript">

    $('.button1').click(function () {

    $.ajax({
       type: "POST",          
       url: '@Url.Action("ActionName", "ControllerName")',
       dataType: "html",
       success: function (result) {
          // after the post action
       }
    });
 });

于 2013-01-15T06:00:20.553 回答