zoukankan      html  css  js  c++  java
  • asp.net mvc(二)

       MVC中的ViewData
       View在MVC模式中与用户进行最直接的接触,负责数据的呈现。注意:view只是负责数据的呈现,我们要尽量让view中不涉及业务逻辑的处理。既然View与后台代码是相分离的,但View和Controller是如何联系在一起的呢,答案就是ViewData。

       ASP.NET MVC默认使用WebForm来作为view。新建的aspx页面继承自ViewPage,所有的aspx页面都必须继承自ViewPage。我们再看一下ViewPage的部分代码:

    public class ViewPage : Page, IViewDataContainer 

      
       我们使用传统的asp.net开发时,经常会为了开发的需要,会写一个类似PageBase类,例如会把部分比较通用的方法写入基类。同样在MVC中,我们也可以这样做。

       第一:创建一个ViewPage<T>类:这个类主要是完成一个继承功能,对MvcContrib.FluentHtml.ModelViewPage,MvcContrib.FluentHtml.ModelViewUserControl的继承,实现System.Web.Mvc.ViewPage的功能。还有一个非常重要的作用就是把所有的扩展方法都体现在这个类中。类中using GuestBook.Common.HtmlHelpers;可以说明。

    using GuestBook.Common.HtmlHelpers;
    namespace GuestBook.Web
    {
        
    public class ViewPage<T> : MvcContrib.FluentHtml.ModelViewPage<T> where T : class
        {
            
    public ViewPage()
            {

            }
        }

        
    public class ViewUserControl<T> : MvcContrib.FluentHtml.ModelViewUserControl<T> where T : class
        {
            
    public ViewUserControl()
            {

            }
        }
    }

       
        第二:对MVC进行扩展。例如对Html的扩展,我们在做增删改查类似操作时,当用户提交后一般都会根据系统处理结果显示一段提示文字给用户。

             1:创建扩展类:HtmlHelperExtensions,主要包含两个方法,一个是操作成功后的处理方法,另一个则是失败后的处理结果。

    public static class HtmlHelperExtensions
          {
            
    public static string ErrorBox(this HtmlHelper htmlHelper, ViewDataBase  errorViewData)
            {
                
    if (errorViewData.ErrorMessage == nullreturn string.Empty;

                HtmlTextWriter writer 
    = new HtmlTextWriter(new StringWriter());

                writer.AddAttribute(
    "class""error");
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
                writer.Write(errorViewData.ErrorMessage);
                writer.RenderEndTag();
                
    return writer.InnerWriter.ToString();
            }

            
    public static string MessageBox(this HtmlHelper htmlHelper, ViewDataBase messageViewData)
            {
                
    if (messageViewData.Message == nullreturn string.Empty;

                HtmlTextWriter writer 
    = new HtmlTextWriter(new StringWriter());

                writer.AddAttribute(
    "class""message");
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
                writer.Write(messageViewData.Message);
                writer.RenderEndTag();
                
    return writer.InnerWriter.ToString();
            }
        }

         
            2:我们看到上面代码中有一个类:ViewDataBase,这个类是所有ViewData的基类,里面主要包含两个字段:1,一般提示内容;2,当发生异常时的提示内容。

    public  class ViewDataBase
        {
            
    public string Message { getset; }
            
    public string ErrorMessage { getset; }

            
    public ViewDataBase WithErrorMessage(string errorMessage)
            {
                
    this.ErrorMessage = errorMessage;
                
    return this;
            }
            
    public ViewDataBase WithMessage(string message)
            {
                
    this.Message = message;
                
    return this;
            }
        }

              
           说明:我们在留言所使用的ViewData类需要继承ViewDataBase

    public class GuestBookInfo : ViewDataBase
        {
            
    public string sTitle
            { 
    getset; }
            
    public string sContent
            { 
    getset; }
            
    public int ID
            { 
    getset; }
        }

          
           3:在View中调用扩展方法:

              1>:页面引用代码的更改:
                   默认的:Inherits="System.Web.Mvc.ViewPage<GuestBook.Common .Models.GuestBookInfo>"
                   扩展后的:Inherits="GuestBook.Web.ViewPage<GuestBook.Common.Models.GuestBookInfo>"

              2>:页面调用代码。  

    <% =Html.MessageBox (Model)%>

           
         总结:通过扩展ViewPage和ViewData实现了对Html的扩展,使得ViewData的功能更加灵活,好用。
         注:本文参考Suteki项目。

  • 相关阅读:
    Raspberry Pi + ArchLinux:网络dhcp不稳定,经常无法获取IP地址
    Chromium OS相比Chrome OS缩水的地方
    ssh config配置更新
    ktouch w619: Dump boot.img和system.img,然后做成recovery可用的刷机zip包
    mmap: invalid argument & MAP_PRIVATE
    Ubuntu 12.04 fcitx已经可以aptget,并且默认是是Google拼音的词库
    epoll_create, epoll_ctl和epoll_wait 实例讲解
    VM上安装Redhat无法选包
    关于Segmentation fault (core dumped)几个简单问题的整理
    Linux字符串转换函数汇总
  • 原文地址:https://www.cnblogs.com/ASPNET2008/p/1541807.html
Copyright © 2011-2022 走看看