创建一个新产品的视图将从Home控制器中返回。列表2中提供了该Home控制器的完整代码。
列表2–Controllers\HomeController.cs
using System;
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using LinqToSqlExtensions;
using Microsoft.Web.Mvc;
using MvcFakes;
using MvcValidation;
using MvcValidationWebsite.Models;
namespace MvcValidationWebsite.Controllers
{
[HandleError]
public class HomeController : Controller
{
private IDataContext _dataContext;
private ITable<Product> _products;
public HomeController()
{
_dataContext = new DataContextWrapper("conProductsDB", "~/Models/ProductsDB.xml");
_products = _dataContext.GetTable<Product>();
}
public ActionResult Index()
{
return View("Index", _products.ToList());
}
[AcceptVerbs("GET")]
public ActionResult Create()
{
return View("Create");
}
[AcceptVerbs("POST")]
public ActionResult Create(FormCollection form)
{
// Perform validation
Validation.Validate<Product>(ViewData.ModelState, form);
if (!ViewData.ModelState.IsValid)
return View("Create", form);
// Create product
var product = new Product();
product.Name = form["name"];
product.Price = Decimal.Parse(form["price"], NumberStyles.Currency);
product.Description = form["description"];
if (!String.IsNullOrEmpty(form["saleStartDate"]))
product.SaleStartDate = DateTime.Parse(form["saleStartDate"]);
if (!String.IsNullOrEmpty(form["saleEndDate"]))
product.SaleEndDate = DateTime.Parse(form["saleEndDate"]);
// Insert product into database
_dataContext.Insert(product);
// Redirect
return RedirectToAction("Index");
}
}
}
using System.Globalization;
using System.Linq;
using System.Web.Mvc;
using LinqToSqlExtensions;
using Microsoft.Web.Mvc;
using MvcFakes;
using MvcValidation;
using MvcValidationWebsite.Models;
namespace MvcValidationWebsite.Controllers
{
[HandleError]
public class HomeController : Controller
{
private IDataContext _dataContext;
private ITable<Product> _products;
public HomeController()
{
_dataContext = new DataContextWrapper("conProductsDB", "~/Models/ProductsDB.xml");
_products = _dataContext.GetTable<Product>();
}
public ActionResult Index()
{
return View("Index", _products.ToList());
}
[AcceptVerbs("GET")]
public ActionResult Create()
{
return View("Create");
}
[AcceptVerbs("POST")]
public ActionResult Create(FormCollection form)
{
// Perform validation
Validation.Validate<Product>(ViewData.ModelState, form);
if (!ViewData.ModelState.IsValid)
return View("Create", form);
// Create product
var product = new Product();
product.Name = form["name"];
product.Price = Decimal.Parse(form["price"], NumberStyles.Currency);
product.Description = form["description"];
if (!String.IsNullOrEmpty(form["saleStartDate"]))
product.SaleStartDate = DateTime.Parse(form["saleStartDate"]);
if (!String.IsNullOrEmpty(form["saleEndDate"]))
product.SaleEndDate = DateTime.Parse(form["saleEndDate"]);
// Insert product into database
_dataContext.Insert(product);
// Redirect
return RedirectToAction("Index");
}
}
}
注意,上面的这个Home控制器中定义了两个Create()行为。在实现一个HTTP GET操作时调用第一个Create()行为。换句话说,当首次显示建一个新产品的表单时调用第一个Create()行为。
接下来请注意,仅当实现一个HTTP POST操作时才调用第二个Create()行为。即当产品表单被寄送到服务器时就调用这个Create()行为。这第二个Create()方法负责校验表单数据;如果不存在校验错误,即把新的产品添加到服务器端数据库中。