首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >@Html.BeginForm()是如何工作的?

@Html.BeginForm()是如何工作的?
EN

Stack Overflow用户
提问于 2013-05-25 05:58:14
回答 3查看 59.7K关注 0票数 22

我是ASP.NET的新手,今天刚开始在asp.net上学习MVC教程。我到了这里,http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view

到目前为止一切顺利,问题是:

在我的视图中,我有以下代码(使用@model MyFirstMVC4.Models.Movie将模型设置为视图)

代码语言:javascript
复制
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Movie</legend>

        @Html.HiddenFor(model => model.ID)

        //... bla bla html input
        <p>
             <input type="submit" value="Save" />
        </p>
    </fieldset>
}

我的MovieController

代码语言:javascript
复制
    // Shows the view
    public ActionResult Edit(int id = 0)
    {
        Movie movie = db.Movies.Find(id);
        if (movie == null)
        {
            return HttpNotFound();
        }
        return View(movie);
    }

    //
    // POST: /Movie/Edit/5

    [HttpPost] // Handles the view above
    public ActionResult Edit(Movie movie)
    {
        if (ModelState.IsValid)
        {
            db.Entry(movie).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(movie);
    }

这就是问题--它到底是怎么把Movie对象传递给上面的POST方法的呢?!当我观察客户端时,有

代码语言:javascript
复制
<form action = "/Movie/Edit/1" ... />

这里我不明白为什么同一个视图页面的action = url?!1在服务器端也只有Html.BeginForm() :(它如何实现发布什么操作方法和传递什么路由参数?它起作用了,我只是不知道为什么

EN

回答 3

Stack Overflow用户

发布于 2013-05-25 06:11:12

在不带任何参数的情况下调用BeginForm()时,它默认使用与呈现当前页面相同的控制器/操作。它假设您的控制器上将有一个名称正确的操作,该操作将接受回发(您确实是这样做的)。它使用RouteValues来实现这一点。

它自动将每个输入控件(按名称)绑定到接受回发的操作的参数,或者在您的情况下,绑定到接受回发的操作的对象参数的属性。

票数 10
EN

Stack Overflow用户

发布于 2013-05-25 06:08:06

[HttpPost]属性被赋予您希望在表单提交后调用的操作。

要理解@using (Html.BeginForm())是如何工作的,您需要知道它已经在哪个页面上。在两个不同的视图中使用@using (Html.BeginForm())将返回到两个不同的控制器

票数 4
EN

Stack Overflow用户

发布于 2016-09-01 08:20:58

我们可以通过输入简单的html或者通过html helpers来创建表单。其中之一是Html.BeginForm();它有点奇怪,因为您实际上可以将它包装在一个using语句中,因为这个特定的帮助器返回一个在C#中实现IDisposable的对象。首先,它用开始标记写出。在底部,当生成的代码在该对象上调用dispose时,它将写出结束表单标记。所以BeginForm给了我一个对象,它将写出我的开始表单标签和结束标签。在此之后,您无需担心任何事情,只需关注标签和输入即可

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16744191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档