前面的例子写出的是常量字符串。下一步就是让它们通过响应URL传进来的参数动态地执行操作。按以下步骤来实现:
(1) 把Browse操作方法修改为,检索从URL传过来的查询字符串值。可以通过在操作方法中添加一个string类型的“genre”参数来实现这个功能。然后,当这个方法被调用时,ASP.NET MVC会自动将名为“genre”的查询字符串或表单提交参数传递给Browse操作方法。
// // GET: /Store/Browse?genre=?Disco public string Browse(string genre) { string message = HttpUtility.HtmlEncode("Store.Browse, Genre = " + genre); return message; }
HTML编码的用户输入
利用方法HttpUtility.HtmlEncode来预处理用户输入。这样就能阻止用户用链接向视图中注入JavaScript代码或HTML标记,比如//Store/Browse?Genre=<script>window.location= 'http://hacker.example.com'</script>。
(2) 浏览到/Store/Browse?Genre=Disco,结果如图2-14所示。
这表明控制器操作可将查询字符串作为其操作方法的参数来接收。
(3) 修改Details操作方法,使其读取和显示一个名为ID的输入参数。这里不像前面的方法那样把ID值作为一个查询字符串参数,而是将ID值直接嵌入到URL中,如 /Store/Details/5。
ASP.NET MVC在不需要任何额外配置的情况下可以很容易地做到这一点。ASP.NET MVC的默认路由约定,就是将操作方法名称后面URL的这个片段作为一个参数,该参数的名称为ID。如果操作方法中有名为ID的参数,那么ASP.NET MVC会自动将这个URL片段作为参数传递过来。
// // GET: /Store/Details/5 public string Details(int id) { string message = "Store.Details, ID = " + id; return message; }
像前面示例演示的那样,控制器操作感觉就像是Web浏览器直接调用控制器类中的方法。类、方法和参数都被具体化为URL中的特定路径片段或查询字符串,结果就是一个返回给浏览器的字符串。这就进行了极大的简化,而忽略了下面这些细节:
●路由将URL映射到操作的方式。
●将视图作为模板生成返回给浏览器的字符串(通常是HTML格式)。
●操作很少返回原始的字符串;它通常返回合适的ActionResult来处理像HTTP状态码和调用视图模板系统这样的事项。
控制器提供了很多自定义和扩展的功能,但是我们很少能用到这些内容。在一般应用中,控制器通过URL被调用,然后执行自定义的代码并返回一个视图。先记住这些内容,后面我们会详述关于控制器如何定义、调用和扩展的底层细节,这些底层内容以及其他高级主题将在第15章中进行讲解。现在已经学习了足够的控制器知识,可以与视图结合起来使用了,第3章中会对这部分内容进行详细介绍。