ASP.NET MVC轻教程 Step By Step 7——改进Write动作方法
在上一节我们使用强类型视图改进Write视图获得更好的智能感知和代码重构,现在可以进一步的改进动作方法。
Step 1. 数据模型绑定
在Save方法中我们使用Request来获取表单传送的值,其实可以将值作为Save的参数传递过来。
public void Save(string nickname,string content) { messages.Add(new Message { NickName = nickname, Content = content, ReleaseDate = DateTime.Now }); Response.Redirect("/Home/Index"); }
注意参数名称和Write视图生成渲染的HTML的标签的name属性值要一致,由于HTML不区分大小写,所以这里的参数名的大小写也无所谓。ASP.NET MVC会自动把QueryString或Form获取的值以name值和参数名对应的方式传递。
不过更好的做法是把Message类的对象作为参数传递过来。如下代码所示。
public void Save(Message message) { message.ReleaseDate = DateTime.Now;
messages.Add(message); Response.Redirect("/Home/Index"); }
我们可以这样做是因为ASP.NET MVC中有一个Model Binder(数据模型绑定)机制,它会自动将通过QueryString或Form获取的name和值重建成一个模型类对象,并传递给动作方法。这样做的优点依然和强类型视图类似,主要是有智能感知和代码重构时比较方便。
Step 2. 动作方法的特性
Write方法负责显示渲染表单,Save方法负责处理表单传递的数据。这样的做法在ASP和php中都很常见,不过每个不同的表单都有不同名称的动作方法,会显得繁琐不够清晰。最好可以使用一个名字,当然不能直接写成两个Write动作方法,不然就会因为重名发生错误。我们可以给动作方法加上特性来区别两个Write。
[HttpGet] public ActionResult Write() { return View(); } [HttpPost] public void Write(Message message) { message.ReleaseDate = DateTime.Now;
messages.Add(message); Response.Redirect("/Home/Index"); }
把Save方法名改成Write,并在两个Write动作方法前分别加上HttpGet和HttpPost特性。前者指定在有人访问页面的时候显示页面,后者是当表单以Post提交的时候处理请求,这样就不会发生歧义了。