1.创建控件,MVC中通过htmlHelper生成HTML标签。

1 <%= Html.TextBox("UserName")%>
2 <%= Html.TextBox("UserName","Coolin")%>
3 <%= Html.TextBox("UserName","Coolin",
            new { @class = "className",disabled = true })%>

最后一项htmlAttributes,可以设置样式等属性。

2.RegisterRoutes带来了什么变化。通过VS创建一个MVC应用程序,会在Global.asax中看到下面的代码(我添加了第一条)
1 routes.MapRoute(
2         "Account",  
3         "Account/List/{type}",                                
4         new { controller = "Account", action = "List" } 
5   );
6
7 routes.MapRoute(
8         "Default",                                                          
9         "{controller}/{action}/{id}",                                
10         new { controller = "Home", action = "Index", id = "" } 
11   );
现在看一下它带来的变化,假设view有如下代码

1 <%= Html.ActionLink("男性", "List", new { type = "Man" }) %>
2 <%= Html.ActionLink("女性", "List", new { type = "Woman" }) %>

1 <%= Url.RouteUrl("Account", new { controller = "Account", action = "List", type= "Man" }) %>
2 <%= Url.RouteUrl("Account", new { controller = "Account", action = "List", type= "Woman" }) %>

对应的Url应该是  localhost:XXXX/Account/List/Man 和 localhost:XXXX/Account/List/Woman
当然也可以不在Global.asax中注册那条规则,对应的Url就会变成大家熟悉的 localhost:XXXX/Account/List?type=Man。
顺便提一下我在开发中遇到过的一个问题,还以上面的例子为例,在程序的开发阶段,没有加入刚才那条规则,当我们在程序中加入了 sitemap(mvcsitemap),结果却是sitemap的路径永远不能指向Woman的路径,可能是sitemap不能通过 ?后面参数区分路径,后来加入了这条规则,url中去掉参数,问题解决了。

3.ajax异步请求controller
controller中有如下代码

1 public ActionResult Delete(Guid id)
2 {
3      Delete(id);
4      return Json(new { success = true });
5 }

view中代码如下

1 $.getJSON(<%= Url.Action("Delete", "Account",new { id="xx-xx-xxx" }) %>,
2     function(result) {
3         if (result.success) {
4             //通过脚本移除此行
5             alert("删除成功!")   
6         }
7     });

 

4.在view与Mvc view user control中使用强类型。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<Account>" %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<Account>>" %>

在view 或 Mvc view user control中的代码如下

<% if (Model != null) { %>
     

<%= Model.Name %>

     
<%= Model.Age %>

<% } %>
在controller中需要将Model赋值

public ActionResult ShowAccount()
{
      var account = new Account { Name = "Name" , Age = 18 };
      return View(account);
}
顺便一提:
当我需要呈现View的时候我会选择 return View()
当我需要ajax异步请求到controller做一些事情时,处理结束后,我会通过 return Json() 返回操作是否成功或返回的数据。
当我需要调用其他action时我会使用 RedirectToAction 或 RedirectToRoute。
当我什么都不需要做的时候我会使用 EmptyResult()。例如数据导出操作等。

5.UpdateModel与TryUpdateModel
虽然在MVC 中可以直接在Controller的方法中定义操作对象,然后通过表单提交装入数据到对象,如下:

public ActionResult Register(Account account)
{ //TODO }
但我会使用UpdateModel和TryUpdateModel去做这些事情,还是简单说一下这两个方法的功能。如果用户操作的view是完成注册用户功能,此时表单数据已经填写完整,提交表单后转入上面的方法( Register() , 去掉参数),在方法中使用如下代码:

public ActionResult Register()
{
      var account = new Account();
      UpdateModel(account);
      //TODO: Register
      return ……
}

这样表单中的数据可以装入 account 对象,后来发现有时总是不成功,程序报错,遂发现TryUpdateModel(),虽然执行后也会有错误,但是部分数据已经正确填入程序也并不会报错,然后将没有填入的数据(问题就发生在这些数据上)单独处理。不能装入的数据通常都是由规律的,例如ID,view中通过DropDownList选择的数据等等,所以可以使用重载方法将可能会出错的数据排除掉, string[] excludeProperties 参数,这样TryUpdateModel就不会报错了,虽然已经找到装入对象时出错的规律,但还是想找到更准确的判断方法,不想这样偷懒下去。偶然间注意到 ModelState.IsValid 这句经常出现的代码,所以就试了一下,在TryUpdateModel语句执行后,在快速监视中添加了ModelState,果然可以看到出错的字段(里面有error属性)。后面的操作就是一样的了,排除这些字段,单独处理!

6.在Action中使用FormCollection,6中使用 string[] excludeProperties 参数排除掉的字段可以通过下面的方法赋值

public ActionResult Register(FormCollection form)
{
      var account = new Account();
      // city在表单中是下拉框选择的(DropDownList)
      if (TryUpdateModel(account , null ,  null , new string[] { "City" } ))   // UpdateModel也可以重载
      {
            account.City = form["City"];
      }
      return ……
}