MVC小技巧
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) { %>   
      <div><%= Model.Name %></div>    
      <div><%= Model.Age %></div>    
<% } %>    
在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 ……    
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号