[MVC]ASP.NET MVC实用集锦(2)

继续和大家分享一些MVC使用技巧与实例。
首先想再补充一下集锦(1)中 的扩展htmlhelper问题,其实在C#3.0,就已经提供了扩展方法这个新特性,我们可以在程序中扩展一些基本类型,也可以扩展一些自定义类型。例 如:String,Datetime ,Enumerable等,具体步骤与扩展htmlhelper没什么区别(还是提醒一下别忘记引用命名空间)。
继续(1)中的顺序往下进行吧.
5.在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()。例如数据导出操作等。
6.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属性)。后面的操作就是一样的了,排除这些字段,单独处理!

7.在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 ……
}
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏