ASP.NET MVC 表单提交教程

简介:

在前面的两篇文章总,我们分别做了一个简单的ASP.NET MVC的例子和进行数据的绑定,在本文中,将通过ASP.NET MVC Framework实现表单的提交,你可以看到,在这里有多种方法来获取表单数据,可以自动映射、通过Request对象获取等。

实现新增数据

1.这里我们还采用上一篇做过的Blog示例(在后面的文章中,我将一直使用该示例),在这之前,先修改一下上次示例中的BlogRepository,为其增加一个Add方法:

public void Add(Post post)
{
    BlogDataContext db = new BlogDataContext();

    db.Posts.InsertOnSubmit(post);
    db.SubmitChanges();
}

2.在Index视图中添加一个可以转向新建Post页面的链接,使用ActionLink()方法:

<h2>ASP.NET MVC Framework Sample</h2> <hr /> <%=Html.ActionLink("Home", new { action="Index"})%> |
<%=Html.ActionLink("New Post", new { action="New"})%>
<div>     <%foreach (Post post in ViewData)
      { %>     <div class="postitem">         <strong>Title</strong><%=Html.Encode(post.Title) %></br>         <strong>Author</strong><%=Html.Encode(post.Author) %></br>         <strong>PubDate</strong><%=Html.Encode(post.PubDate.ToShortDateString()) %></br>         <strong>Content</strong><%=Html.Encode(post.Description) %></br>     </div><br />     <% } %> </div>

在上面的代码中,第四行我们添加了New Post超链接,并指定该链接的action为New,这里我们也可以通过action名称来指定:

<h2>ASP.NET MVC Framework Sample</h2> <hr /> <%=Html.ActionLink("Home", "Index")%> | <%=Html.ActionLink("New Post", "New")%>  <div>     <%foreach (Post post in ViewData)
      { %>     <div class="postitem">         <strong>Title</strong><%=Html.Encode(post.Title) %></br>         <strong>Author</strong><%=Html.Encode(post.Author) %></br>         <strong>PubDate</strong><%=Html.Encode(post.PubDate.ToShortDateString()) %></br>         <strong>Content</strong><%=Html.Encode(post.Description) %></br>     </div><br />     <% } %> </div>

3.编写控制器中的New action代码,这里代码非常简单,因为我们只需要转向新建Post视图就可以了,并不需要其他的操作:

[ControllerAction]
public void New()
{ 
    //转向新页面     RenderView("New");
}

4.编写New视图,在这里我们将提供一些表单,供用户输入数据,编写HTML代码如下:

<h2>New Post</h2> <hr /> <div class="postitem">     Title:<input id="title" name="title" type="text" /><br /><br />     Author:<input id="author" name="author" type="text" /><br /><br />     Content:<textarea id="description" name="description" cols="40" rows="5"></textarea><br /><br />     <input type="submit" value="Save" /> </div>
接下来添加一个HTML的form元素,并指定它的action为我们要增加新的Post的action,这里假定为Add,并且指定method为Post,最终我们完成的代码应该看起来如下所示:
<h2>New Post</h2> <hr /> <div class="postitem">     <form action="Add" method="post">         Title:<input id="title" name="title" type="text" /><br /><br />         Author:<input id="author" name="author" type="text" /><br /><br />         Content:<textarea id="description" name="description" cols="40" rows="5"></textarea><br /><br />         <input type="submit" value="Save" />     </form> </div>

获取表单数据

完成了上面的步骤之后,就可以编写控制器中Add action的代码,在这里需要获取表单的数据,并将其写入到数据库,ASP.NET MVC Framework中提供了多种方法获取表单数据。

1.自动映射

使用这种方法,我们只需要把方法的参数定义表单的名称,ASP.NET MVC Framework将会自动帮助我们进行映射,直接把表单的数据赋值给form的Action所对应的方法参数上,如下代码所示:

[ControllerAction]
public void Add(string title, string author, string description)
{
    Post post = new Post();
    post.Title = title;
    post.Author = author;
    post.Description = description;
    post.PubDate = DateTime.Now;

    BlogRepository repository = new BlogRepository();
    repository.Add(post);

    RedirectToAction("Index");
}

2.第一种方法在使用时,如果界面上表单过多,会使方法的参数变大,这样好像就变成了重构中所说的“脏代码”,为了解决这个问题,我们还可以使用窗体变量来获取表单的值,使其代码看起来如下所示:

[ControllerAction]
public void Add()
{
    Post post = new Post();
    post.Title = Request.Form["title"];
    post.Author = Request.Form["author"];
    post.Description = Request.Form["description"];
    post.PubDate = DateTime.Now;

    BlogRepository repository = new BlogRepository();
    repository.Add(post);

    RedirectToAction("Index");
}

上面这两种方法都是获取表单的值,并将其保存到数据库中,转向Index action进行处理。

3. 在MVCToolkit中还提供了一些扩展的方法,可以用来获取表单的值,后面的文章再说。

配置路径选择

这一步什么时候都不能忘,这次我们修改一下,变为controller/action的形式,代码如下:

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup     RouteTable.Routes.Add(
                new Route                 {
                    Url = "[controller]/[action]",
                    Defaults = new { action = "Index" },
                    RouteHandler = typeof(MvcRouteHandler)
                });
}

完成数据增加

上面的示例运行后如下所示,首先是Index视图中有一个New Post链接:

TerryLee_MVC_007

点击New Post后:

TerryLee_MVC_008

提交之后,增加一条新的Post,并转向Index视图:

TerryLee_MVC_009

结束语

关于在ASP.NET MVC Framework中实现表单的提交简单示例到这里就结束,相信通过前面三篇简单的文章,大家对ASP.NET MVC Framework已经有了一个大概的认识,后面我会写一些深入一点的文章以及MVCToolkti提供的一些HTML Helper方法:)
















本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/554138 ,如需转载请自行联系原作者


相关文章
|
3月前
|
开发框架 JSON JavaScript
ASP.NET Core3.1实战教程---基于Jquery单文件上传
ASP.NET Core3.1实战教程---基于Jquery单文件上传
26 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
41 0
|
28天前
|
开发框架 .NET 物联网
.NET从入门到精通,零基础也能搞定的基础知识教程
.NET从入门到精通,零基础也能搞定的基础知识教程
20 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
3月前
|
XML 前端开发 定位技术
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
C#(NET Core3.1 MVC)生成站点地图(sitemap.xml)
25 0
|
3月前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
123 0
|
4月前
|
定位技术 C#
.NET微信网页开发相关文章教程
.NET微信网页开发相关文章教程
|
4月前
|
XML 数据可视化 数据库
VB.NET—DataGridView控件教程详解
VB.NET—DataGridView控件教程详解
136 0