ASP.NET MVC 入门 5 View与ViewData 最后讲解

本文详细介绍了如何在ASP.NET MVC中通过Controller的Action方法使用ViewData向View页面传递数据,包括数据类型转换、使用ViewPage<TModel>实现强类型传递、ViewData.Model的应用,以及如何在View页面中取出数据并呈现给用户。同时讨论了默认的WebFormView搜索View的顺序、Eval方法的使用,以及在某些特定情况下的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public ActionResult Index( int ? id)
{
    ViewData[
" Title " ] = BlogSettings.Instance.Name;

    List
< IPublishable > posts = BlogEngine.Core.Post.Posts
        .ConvertAll(
new Converter < Post, IPublishable > ( delegate (Post p) { return p as IPublishable; }));

   
int pageIndex = (id !=   null   && id.HasValue && id.Value >   0 ) ? id.Value : 1 ;
   
int pageSize = Math.Min(posts.Count, BlogSettings.Instance.PostsPerPage);
   
if ((pageIndex -   1 ) * pageSize + pageSize > posts.Count)
    {
       
return ShowMsg( new List < string > () { " 页码超出范围 " });
    }
    posts
= posts.GetRange((pageIndex -   1 ) * pageSize, pageSize);

    ViewData[
" Posts " ] = posts; // 向ViewData中传数据

   
// 这里返回View给客户端,如果不指定要返回的View的名称,
   
// 就是返回和Action同名的View,
   
// 也就是相当于return View("Index");
    return View();
}
复制代码

默认的WebFormView搜索View的顺序是按如下顺序搜索的:

image

其中{1}为ControllerName,{0}为ActionName。MasterLocationFormats为母版页的搜索顺序。

在上面的代码中我们使用ViewData["Posts"]向View页面传递数据,然后我们就可以在View中取出数据并呈现给用户,Views/Home/Index.aspx页面的部分代码如下:

image

如上红色框中的代码,我们可以从ViewData中取出数据,并转换为相应的类型。在这里我们发现ViewData要做一个类型的转换,其实我们可以将ViewData.Model设置为强类型,只需将我们的View页面继承自ViewPage<TModel>就可以了:

image

然后在Controller里面return View()的时候直接给ViewData.Model传值,如下所示:

image

然后在View中我们可以直接从强类型的ViewData.Model中取值:

image

由上面的代码我看可以看出ViewData.Model就是List<IPublishable>类型,并不需要再进行类型的转换。

ViewData还有一个Eval的方法,我们可以使用这个方法从ViewData中取值。假如我么在Action中使用return View(Post);给View传递一篇日志的数据。而Post有一个Previous的属性指向前一篇日志,则我们可以在View页面中可以这样来取值:<%= ViewData.Eval("Previous.Title")%>

但是如果使用我最后提供的示例Blog程序的代码这样在取值的时候直接在里面使用"."来取值,你会发现取不了值。因为BlogEngine里面的BusinessBase类实现了IDataErrorInfo接口,而IDataErrorInfo有一个索引器,也就是说BusinessBase有一个索引器,就因为有一个索引器,使Eval中不能用点来取值(不知道是不是bug?)。

补充:上面说到的不是Bug,是因为BusinessBase实现了IDataErrorInfo接口,该接口有个索引器,导致ViewData.Eval()方法调用时搜索索引器的值时返回String.Empty而使ViewData.Eval()认为是找到值了,从而失效。

image

我们可以将return string.Empty修改为return null,这样就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值