当把一个XHTML表单回寄到服务器时调用第二个Create()方法。当表单数据被回寄时,该Create()方法将调用控制器的UpdateModel()方法以便生成一个Product类(它把所有的表单值进行提交)。接下来,调用ForumRepository.Add()方法以便把新的Product类实例添加到数据库。
注意,上述两个语句都包含在一个Try..Catch块内。如果任意一个方法,无论是Controller.UpdateModel()还是ForumRepository.Add()方法,失败,那么,即执行这个Try…Catch语句的Catch子句。第一个Catch子句使用校验错误信息更新ViewData.ModelState属性(通过把校验错误从RuleViolationException复制到ModelState)。接下来,重新显示Create视图。
注意,还存在两个Catch语句。第二个Catch子句捕获一个泛型异常。当UpdateModel()方法遇到一个校验错误时(错误的类型值被赋给一个属性),调用这个Catch子句。当存在网络问题(例如你的数据库服务器或你的数据库服务器崩溃)时,将调用这个子句。注意,一个名字为message的错误键也同时被更新。
列表7中提供了Create视图的完整的实现代码。
列表7--Create.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Create.aspx.cs" Inherits="MvcForums.Views.Forum.Create" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
<style type="text/css">
.input-validation-error
{
border: solid 2px red;
}
#message
{
padding: 5px;
color:red;
}
</style>
</head>
<body>
<div>
<form method="post" action="/Forum/Create">
<div id="message">
<%= Html.ValidationMessage("message") %>
</div>
<input name="author" type="hidden" value="Stephen" />
<label for="subject">Subject:</label>
<%= Html.TextBox("subject") %>
<%= Html.ValidationMessage("subject") %>
<br /><br />
<label for="body">Body:</label>
<%= Html.TextArea("body") %>
<%= Html.ValidationMessage("body") %>
<br /><br />
<input type="submit" value="Post" />
</form>
</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
<style type="text/css">
.input-validation-error
{
border: solid 2px red;
}
#message
{
padding: 5px;
color:red;
}
</style>
</head>
<body>
<div>
<form method="post" action="/Forum/Create">
<div id="message">
<%= Html.ValidationMessage("message") %>
</div>
<input name="author" type="hidden" value="Stephen" />
<label for="subject">Subject:</label>
<%= Html.TextBox("subject") %>
<%= Html.ValidationMessage("subject") %>
<br /><br />
<label for="body">Body:</label>
<%= Html.TextArea("body") %>
<%= Html.ValidationMessage("body") %>
<br /><br />
<input type="submit" value="Post" />
</form>
</div>
</body>
</html>
注意,上面的视图中包括了一个泛型错误消息(名字为message)。