ASP.NET MVC 学习: 视图(http://whx.tzgt.gov.cn/newOperate/html/1/12/123/12058.html)

用视图呈现UI
视图可以不包含任何应用逻辑或者数据库检索代码,所有的应用逻辑都可以在controller中进行处理。

视图通过使用controller类在调用RenderView方法的时候提供视图相关数据对象呈现UI:

public   void  Categories()
{
    List
< Category >  categories  =  northwind.GetCategories();
    RenderView(
" Categories " , categories);

禁止访问Views目录
为了在你的ASP.NET MVC WEB应用程序中添加额外的安全性,你可以直接阻止访问Views目录。添加如下的代码到你Views目录下的web.config中的system.web节下就可以了:

< authorization >
  
< deny  users ="*" />
< / authorization >  

 

ASPX视图页
ViewPage类型的视图页是Page类的一个实例。我们看一下下面的视图页: 

using  System;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Mvc; 

namespace  MvcApplication.Views.Home
{
    
public partial class Index : ViewPage< CompanyInfo>
    
{
    }

}

它继承自ViewPage< T>,我们看一下继承关系:

using  System; 

namespace  System.Web.Mvc
{
    
public   class  ViewPage < TViewData >  : ViewPage
    {
        
public  ViewPage(); 

        
public  TViewData ViewData {  get ; } 

        
protected   internal   override   void  SetViewData( object  viewData);
    }

而ViewPage< T>又继承自ViewPage:

image

这里注意一下ViewPage提供的公共方法,经常要用到的。
而ViewPage还实现了一个IViewDataContainer的接口,这个接口里面只有一个属性,就是我们经常用的ViewData :

image

下面的示例演示了如何使用ViewData属性,这个属性有两中变异。如果你的View继承自System.Web.Mvc.ViewPage类,则ViewData属性是一个dictionary.这个属性提供一个索引器接收一个dictionay键.下面是继承自System.Web.Mvc.ViewPage类的示例:

< % @ Page Language="C#" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication5.Views.Home.About"  %>
< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
  
< title > ViewData Property - Dictionary Based < / title >
< / head >
< body >
  
< div >
    
< % = " About  "   +  ViewData[ " CompanyName " ] %>
  
< / div >
< / body >
< / html >  

当然,我们还可以使用一个强类型的ViewData属性.这个为数据从控制器传递到视图中提供更好的类型检测.下面的示例是使用强类型的ViewData,视图页是继承自ViewPage< T>的:

< % @ Page Language="C#" AutoEventWireup="true" CodeBehind="About.aspx.cs" Inherits="MvcApplication.Views.Billing.Account"  %>
< head  id ="Head1"  runat ="server" >
  
< title > ViewData Property - Strongly Typed < / title >
< / head >
< body >
  
< div >
    
< % = " About  "   +  ViewData.CompanyName  %>
  
< / div >
< / body >  

设置视图数据

通常,你提供数据给视图来呈现.要呈现视图,你调用控制器中的RenderView方法.这里有两种途径来将数据从控制器传递到视图中.Controller类暴露一个ViewData的属性,它返回键大小写无关的IDictionay< string,object>类型.你可以分配索引值到这个数据字典中.看下面的示例:

public  SampleController : Controller
{
    
public   void  Welcome() 
    {
        ViewData[
" FirstName " =   " Joe " ;
        ViewData[
" LastName " =   " Healy " ;
        RenderView(
" Welcome " );
    }

如果只是用一个视图名来调用RenderView方法,就像上面的示例所示,这个Controller对象的ViewData属性会被作为dictionary来传递给View.如果你希望使用一个强类型的ViewData属性,你可以忽略ViewData属性.作为代替,你创建一个你想传递到View中的对象,然后将它传递给RenderView方法.就如下面示例所示:

public   class  SampleViewData 
{
    
public string FirstName getset; }
    
public string LastName getset; }
}
 

public  SampleController : Controller 
{
    
public void Welcome() {
        SampleViewData viewData 
= new SampleViewData();
        viewData.FirstName 
= "Joe";
        viewData.LastName 
= "Healy";
        RenderView(
"Welcome", viewData);
    }

}
 

在Actions方法之间传递状态

Action方法很可能必需传递数据到另外一个Action中,就好像当一个form提交的时候发生了错误,那样的话,用户应该被重定向到一个可以显示出错信息的页面中.
在Action方法调用控制器的RedirectToAction方法调用其他Action之前,Action方法可以设置Controller的TempData属性到任意一个对象.这个TempData属性值是保存在session中的.另外一个Action可以检查TempData属性并获取值来在它自己的视图中显示.TempData的值只是在一个请求到下一个请求中保留.
下面是示例演示了如何捕捉错误并重定向到一个使用原始数据的错误页中:

< form  action ="/App/InsertCustomer" >
  
< %  if (ViewData.ErrorMessage != null) {  %>
    The following error occurred while inserting the customer data:
    
< br  />
    
< % =  ViewData.ErrorMessage  %>
    
< br  />
  
< %  }  %>  

  First name: 
< input  type ="text"  name ="firstName"
      value
="< %= ViewData.FirstName %>"   />< br  />
  Last name: 
< input  type ="text"  name ="lastName"
      value
="< %= ViewData.LastName %>"    />< br  />  

    
< input  type ="submit"  value ="Insert"   />
< / form >  

 

Action间传递数据
public class InsertError {
    
public string ErrorMessage getset; }
    
public string OriginalFirstName getset; }
    
public string OriginalLastName getset; }
}
 

// CustomersController 

public void InsertCustomer(string firstName, string lastName) {
    
// Check for input errors.
    if (String.IsNullOrEmpty(firstName) ||  
            String.IsNullOrEmpty(lastName)) 
{
        TempData[
"error"= new InsertError("Both names required"
            firstName, lastName);
        RedirectToAction(
"NewCustomer");
        
return;
    }
 

    
// No errors
    
// 
}
 

public void NewCustomer() {
    InsertError err 
= TempData as InsertError;
    
if (err != null{
        
// If there is error data from the previous action, display it.
        ViewData.FirstName = err.OriginalFirstName;
        ViewData.LastName 
= err.OriginalLastName;
        ViewData.ErrorMessage 
= err. ErrorMessage;
    }
 

    
// 
}

转载于:https://www.cnblogs.com/joeliu/archive/2008/06/22/1227580.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值