asp.net-mvc – @ Html.BeginForm()如何工作?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – @ Html.BeginForm()如何工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。



我对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的视图)

@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>
}

我的电影控制器

// 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);
    }

这里是一个问题 – 它如何通过电影对象到上面的POST方法?当我观察客户端的时候

<form action = "/Movie/Edit/1" ... />

这里我不明白为什么action = url的相同的视图页面
在服务器端也只有Html.BeginForm():(
它如何实现什么动作方式发布和路由参数通过?
它的作品,我只是不知道为什么

解决方法

代码中的BeginForm版本,
没有参数,将HTTP POST发送到当前URL,因此如果视图是响应
/ Movie / Edit / 5,打开表单标签将如下所示:
< form action =“/ Movie / Edit / 5”method =“post”>

BeginForm的HTML帮助器询问路由引擎如何达到“编辑”操作
MovieController.在幕后,它在路由上使用名为GetVirtualPath的方法
由RouteTable暴露的属性 – 这是您的Web应用程序注册其所有路由的地方
Global.asax中.如果您没有使用任何HTML帮助器,您就必须编写以下所有内容
码:

@{
 var context = this.ViewContext.RequestContext;
  var values = new RouteValueDictionary{
  { "controller","movie" },{ "action","edit" }
 };
  var path = RouteTable.Routes.GetVirtualPath(context,values);
 }
 <form action="@path.VirtualPath" method="get">
  ...
 </form>

你问过电影对象如何传递.这就是所谓的模型绑定.
当您使用参数进行操作时,MVC运行时将使用模型绑定器构建
参数.您可以在MVC运行时为不同类型注册多个模型绑定
的模型,但默认情况下的主题将是DefaultModelBinder.

在电影的情况下对象,默认模型binder检查电影并查找所有可用的电影属性用于绑定.根据您之前检查的命名约定,默认模型binder可以自动将请求中的值转换并移动到电影对象中(模型绑定器可以还创建一个要填充的对象的实例).换句话说,当模型绑定器看到Movie具有Title属性时,它会查找一个值在请求中命名为“标题”.请注意,模型绑定器在请求中显示“而不是”集合“.模型绑定器使用称为值提供者的组件来搜索值不同领域的请求.模型绑定器可以查看路由数据,查询字符串和表单收集,如果您愿意,您可以添加自定义值提供程序.

猜你在找的asp.Net相关文章