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提交的时候处理请求,这样就不会发生歧义了。

posted @ 2015-11-11 22:44  iLoop  阅读(425)  评论(0编辑  收藏  举报