热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

边看边译《asp.netmvc4inaction》(二)

3.2.3带视图模型的强类型视图当使用基于Razor的视图时,视图默认继承两个类型:System.Web.Mvc.WebViewPage或者System.Web.Mvc.WebVi

3.2.3 带视图模型的强类型视图

当使用基于Razor的视图时,视图默认继承两个类型:System.Web.Mvc.WebViewPage或者System.Web.Mvc.WebViewPage。泛型WebViewPage继承自WebViewPage,但是提供了一些非泛型WebViewPage类里没有的独特的补充。

      下面展示了WebViewPage的主干成员定义:

 

清单 3.3

 

public class WebViewPage : WebViewPage
{
public new AjaxHelper Ajax { getset; }
public new HtmlHelper Html { getset; }
public new TModel Model { get; }
public new ViewDataDictionary ViewData { getset; }
}

 

除了通过Model属性在ViewData.Model之上提供了一个强类型包装器外,WebViewPage类还提供访问关联视图的帮助器对象的强类型版本,AjaxHelper和HtmlHelper。

     要使用强类型视图,首先你必须确保控制器动作正确设置了ViewData.Model。在清单3.4里,我们获取所有的留言记录,显示在列表页面,并传递个人档案的整个集合到View方法,此方法封装了对ViewData.Model属性的设置。

 

清单 3.4

 

public ActionResult Index()
{
var mostRecentEntries = (from entry in _db.Entries
orderby entry.DateAdded descending
select entry).Take(20);
var model = mostRecentEntries.ToList();
return View(model);
}

 

 

在与这个动作相应的Index视图里,即使松散类型的WebViewPage类也能使用ViewData.Model属性。但是这个属性只是一个object类型,我们需要对它进行转换以便有效地使用它。作为替代方案,我们能用@model关键词指定模型的类型。

 

@using Guestbook.Models
@model List

通过用@model关键词指定模型的类型,我们的视图现在继承自WebViewPage而不是WebViewPage,我们有了一个强类型视图。我们也用@using关键词导入名字空间。在下一部分,我们将看到如何使用模型对象在视图里显示信息。

 

3.2.4

一般要在视图里显示信息,你可以使用HtmlHelper对象帮助获得视图模型以生成HTML。考虑下下面的清单,我们呈现了一个完整的留言板记录。

清单 3.5

 

<h2>Guestbook Entryh2>
<dl>
<dt>Name:dt>
<dd>@Model.Namedd>
<dt>Date Added:dt>
<dd>@Model.DateAddeddd>
<dt>Message:dt>
<dd>@Model.Messagedd>
dl>
<p>
@{
bool hasPermission =
(bool) ViewData["hasPermission"];
}
@if (hasPermission)
{
@Html.ActionLink("Edit", "Edit",
new {id = Model.Id})
}
@Html.ActionLink("Back to Entries", "Index")
p>

在这里,我们显示在模型里传递的留言板详细信息。接着,我们用Razor多行代码语句从ViewData中获取”hasPermission“的值。Razor多行语句用at符号后跟一个大括号来开始一个代码块:@{。最后,我们用一个Razor的if块来有条件的显示Edit链接。因为当在屏幕上显示未编码的用户输入时有可能遭到各种脚本攻击,所以数据在呈现到屏幕以前默认是被自动编码的。为了显示未编码的信息,我们可以使用Html.Raw方法强制显示原生文本。

      在登录页面,我们用一个视图模型对象代表完整的表单,就像下面清单显示的:

清单 3.6

 

public class LogOnModel
{
[Required]
[Display(Name = "User name")]
public string UserName { getset; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { getset; }
[Display(Name = "Remember me?")]
public bool RememberMe { getset; }
}

LogOnModel类很简单,只包括必须的属性。你在这里看到的特性是数据注解,关于它们更多的内容会在第4章学到。对于每一个属性在登录页面都会显示一个输入元素,如图3.2所示。

边看边译《asp.net mvc 4 in action》(二)

图3.2 登录页

 

因为我们为登陆页选择了强类型视图,我们能用内建的帮助器来为每一个输入元素绘制出HTML。取代松散的绑定到代表动作参数的字符串,我们能利用基于表达式的HtmlHelper扩展创建各种类型的输入元素,如下:

清单 3.7

 

@using (Html.BeginForm()) {
@Html.ValidationSummary(true,
"Account creation was unsuccessful. " +
"Please correct the errors and try again.")
<div>
<fieldset>
<legend>Account Informationlegend>
<div class="editor-label">
@Html.LabelFor(m => m.UserName)
div>
<div class="editor-field">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(
m => m.UserName)
div>
<div class="editor-label">
@Html.LabelFor(m => m.Email)
div>
<div class="editor-field">
@Html.TextBoxFor(m => m.Email)
@Html.ValidationMessageFor(m => m.Email)
div>
<div class="editor-label">
@Html.LabelFor(m => m.Password)
div>
<div class="editor-field">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
div>
<div class="editor-label">
@Html.LabelFor(m => m.ConfirmPassword)
div>
<div class="editor-field">
@Html.PasswordFor(m => m.ConfirmPassword)
@Html.ValidationMessageFor(m => m.ConfirmPassword)
div>
<p>
<input type="submit" value="Register" />
p>
fieldset>
div>
}

在先前的清单里,我们为强类型视图页面使用了几个HtmlHelper的扩展方法,这些方法分别针对标签,输入框和验证信息。取代用松散类型的字符串代表属性,在asp.net mvc 1里就是这样使用( @Html.TextBox("UserName")),这些帮助器方法利用c# 3.5的表达式来生成HTML。因为这些生成的HTML元素需要与对象中的属性匹配,所以只适合用于原生的类型和与表达式一起使用的对象。

     在清单3.7里Html.LabelFor和Html.TextBoxFor方法为UserNam属性产生HTML:

清单3.8

<label for="UserName">User namelabel>
<input id="UserName" name="UserName" type="text" value="" />

为了让我们的页面通过可访问性验证,每一个输入元素(如清单3.8的第二行)需要包含一个相应的标签元素(如第一行)。因为我们的标签和输入元素都是用表达式生成的,所以我们不再担心标签和输入名称硬编码的问题。

      表格3.1列出了用于强类型视图的HtmlHelper的各种扩展方法。

 

表格3.1

  •  DisplayFor
  • DisplayTextFor
  • EditorFor
  • CheckBoxFor
  • DropDownListFor
  • HiddenFor
  • LabelFor
  • ListBoxFor
  • PasswordFor
  • RadioButtonFor
  • TextAreaFor
  • TextBoxFor
  • ValidateFor
  • ValidationMessageFor

由于我们的表单是用强类型视图生成的,我们可以在设计表单post的动作上利用这一点。不用枚举每个输入域的值作为动作方法的参数,我们可以把所有的参数都绑定到与呈现视图同一个的视图模型上,如下所示。

清单3.9

 

public ActionResult LogOn(LogOnModel model, string returnUrl)
{
// Action method body here
...
}

正如你看见的,LogOn动作方法使用单个LogOnModel对象,以及要返回的URL,而不是为表单里的每个输入元素用一个方法参数。

     HtmlHelper扩展可能是强大的,但如果只依赖这些扩展产生HTML,在视图里仍然会引入了相当多的重复。例如,如果每个输入元素需要一个相应的标签,为什么不总是包括它呢?每个用户界面是不同的,所以MVC团队不能预知每个人所用的输入和标签元素的布局。虽然每个输入元素都应该有一个标签,现有的创建输入元素的辅助方法不适合包括标签元素。作为替代方案,我们可以利用在asp.net mvc 2里介绍的功能——模版——用一种标准化的方式产生HTML。


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
author-avatar
留盏灯开扇门
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有