ASP.MVC-NOTE

MVC3.0-NOTE:

打开RSVP 表,右键点击DinnerID 字段,选择“关系…”菜单项,接下来弹出表和列对话框,指定相关的表和列的关系.

public string Welcome(string name,int numTimes=1) 注意这里我们使用了C#的可选参数,当URL地址中没有使用numtimes参数时,该参数被默认设定为1。

如果没有发生变化的话,则可能你的网页被缓存住了,可以按Ctrl+F5键来在重新刷新页面时取消缓存

由于这里我们需要将一个Movie类传递给视图,所以在“添加视图”对话框中,我们勾选“创建强类型视图”复选框,在模型类下拉框中选择“Movie(MvcMovie.Models)”(如果模
型类中不存在这个类,请先点击调试菜单下的“生成MvcMovie”生成该类),在支架模板下拉框中选择“List”,最后勾选“引用脚本”复选框。

在Create方法中点击鼠标右键,并点击上下文菜单中的“添加视图”。

[Required(ErrorMessage = "必须输入票价")]
[Range(1, 100, ErrorMessage = "票价必须在1元到100元之间")]
public decimal Price { get; set; }

 

return HttpUtility.HtmlEncode("Hello " + name + ",NumTimes is:" + numTimes);

打开解决方案资源管理器中Views文件夹下的Shared文件夹下的_Layout.cshtml文件。该文件被称为布局页面,位于公有文件夹Shared下,
被所有其他网页所共用。

利用NuGet来安装EFCodeFirst:点击“工具”菜单下的“Library Package Manager”子菜单下的“Add Library Package Reference”菜单
选项...

这个System.ComponentModel.DataAnnotations命名空间是.NET Framework中的一个命名空间。它提供了很多内建的验证规则,你可以对任
何类或属性显式指定这些验证规则。 

form["LoginName"]     @MvcHtmlString.Create(ShowHtml)

ModelState.AddModelError("pwd", "密码错误!");

 

 

 

 

MVC2.0-NOTE:

 

<%=Html.Encode(Model.Description) %>

<%= Html.TextBox("EventDate", String.Format("{0:g}", Model.EventDate)) %>
<%= Html.TextBox("Title", Model.Title, new { size=30, @class="myclass" } )%>

Controller 类有一个ModelState 属性集合,可以用来提示传递到视图的model 对象是否有错误。ModelState中Error 记录识别模型属性的
名称和错误信息,并允许指定友好的错误信息。

<%= Html.ValidationMessage("EventDate")%>
上述代码输出:<span class="field-validation-error"> The value ‘BOGUS' is invalid</span>
Html.ValidationMessage() 辅助方法也支持第二个参数,允许开发人员覆盖错误消息:
<%= Html.ValidationMessage("EventDate","*") %>
上述代码输出:<span class="field-validation-error">*</span>,而不是默认的错误信息。

<%= Html.ValidationSummary("Please correct the errors and try again.") %>

并使用UpdateModel() 辅助方法(就像Edit 方法一样),将表单传递
过来的值赋给Dinner 对象


在HTTP-POST 的Create 方法中,有很多办法可以访问表单提交过来的参数值。
一个方法是创建新的Dinner 对象,并使用UpdateModel() 辅助方法(就像Edit 方法一样),将表单传递
过来的值赋给Dinner 对象。接着,添加Dinner 对象到DinnerRepository,并持久化到数据库,并重定向
到Details action 方法,并显示新创建的Dinner 对象:
// POST: /Dinners/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create() {
Dinner dinner = new Dinner();
try {
UpdateModel(dinner);
dinnerRepository.Add(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new {id=dinner.DinnerID});
}
catch {
ModelState.AddRuleViolations(dinner.GetRuleViolations());
return View(dinner);
}
}
另外一个方法是Create() action 方法接收一个Dinner 对象作为方法参数。接着ASP.NET MVC 自动实例化
一个新的Dinner 对象,并使用表单输入的参数赋值给Dinner 对象的属性,然后传递给action 方法,代
码如下:
// POST: /Dinners/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Dinner dinner) {
if (ModelState.IsValid) {
try {
dinner.HostedBy = "SomeUser";
dinnerRepository.Add(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new {id = dinner.DinnerID });
}
catch {
ModelState.AddRuleViolations(dinner.GetRuleViolations());
}
}
return View(dinner);
}


我们的NerdDinner 应用程序将使用这一技术,添加[Bind]属性,显示可绑定的属性:
[Bind(Include="Title,Description,EventDate,Address,Country,ContactPhone,Latitude,Longitud
e")]
public partial class Dinner {
...
}


<%= Html.DropDownList("Country", ViewData["Countries"] as SelectList) %>


定制ViewModel 类:
例如,针对Dinner 的Edit 视图,我们创建一个DinnerFormViewModel 类,公开了2 个强类型的属性:
Dinner 对象和SelectList 模型类(用来填充国家下拉列表框)。
public class DinnerFormViewModel {
// Properties
public Dinner Dinner { get; private set; }
public SelectList Countries { get; private set; }
// Constructor
public DinnerFormViewModel(Dinner dinner) {
Dinner = dinner;
Countries = new SelectList(PhoneValidator.AllCountries, dinner.Country);
}
}

为了消除Edit.aspx 和Create.aspx 视图模板的重复,我们创建一个Partial View 模板,命名为
DinnerForm.ascx,封装两个页面中表单布局和输入元素相同的部分

int? page 该参数定义为nullable 整型.
C#操作符(??),该操作在处理nullable 类型时,非常有用。如果page 参数为空(null),上述代码将对page 赋值为0。

接着更新\Views\Dinners\Index.aspx 视图模板, 从继承ViewPage<IEnumerable<Dinner>> 更新为
ViewPage<NerdDinner.Helpers.PaginatedList<Dinner>>

上述代码使用Html.RouteLink() 辅助方法生成HTML 超链接,这一方法与我们前面使用的Html.ActionLink()
辅助方法比较相似。区别是生成URL 地址时,使用Global.asax 文件中设置的路由规则。确保生成的URL
和Index() Action 方法有相同的格式:/Dinners/Page/{page} – 其中{page} 参数值基于当前页的序号来提
供。

你可以在如下目录:
\Windows\Microsoft.NET\Framework\v2.0.50727\
运行 aspnet_regsql.exe 工具,添加合适的membership schema,以及其他ASP.NET 应用程序服务到数据
库中。

[Authorize]
[AcceptVerbs(HttpVerbs.Post), Authorize]
[Authorize(Users="scottgu,billg")] //仅允许2 个指定的用户,“scottgu”和“billg” 访问;
将特定的用户名直接写在代码中不易于将来的代码维护,更好的办法是定义一个roles(角色),然后通
过数据库或者活动目录(Active Directory)映射用户到角色中。ASP.NET 提供了一个内置的角色管理API
和一组内置的Role provider(包括SQL 和活动目录),帮助实现用户/角色的映射。我们接着更新代码,
仅允许admin 角色的用户访问/Dinners/Create URL。
[Authorize(Roles="admin")]
public ActionResult Create() {
...
}

在查询当前登录的用户名时,我们可以使用Controller 基类公开的User.Identity.Name 属性.例如:dinner.HostedBy =
User.Identity.Name;

<% if (Model.IsUserRegistered(Context.User.Identity.Name)) { %>

var dinners = from dinner in FindUpcomingDinners()

join i in db.NearestDinners(latitude, longitude)
on dinner.DinnerID equals i.DinnerID
select dinner;

 

 

 

扩展Html Helper类,ASP.NET MVC框架提供了一个帮助我们构造Html元素的类:TagBuilder;

在ASP.NET MVC中,有三种拦截器:Action拦截器、Result拦截器和Exception拦截器。其实所谓的ASP.NET MVC拦截器,也没什么神秘的,
就是一个普通的类而已。只不过需要继承FilterAttribute基类,Action拦截器还要实现IActionFilter接口,而Exception拦截器需要实现
IExceptionFilter接口。

需要注意的是,我们新的路由规则一定要放在前面,因为ASP.NET MVC会自上向下匹配第一条找到的可匹配路由规则。

return Release(); 使用了Redirect,ViewData的信息就传不过去了。

一般情况下,在使用了ASP.NET MVC后,目录结构变得有点诡异,像js、css、图片等与路径(即使是相对路径)引用相关的地方可能会出现
问题,但是,只要你在这些地方用Url.Content生成路径,而不是直接将路径写在页面里,一般就没什么问题了。所以,凡是引用js、css、
图片等除,请一定使用Url.Content生成路径.

因为DinnerRepository 类需要访问数据库,DinnersController 类对DinnerRepository 类的紧耦合导致
DinnersController action 方法的测试都需要连接数据库。
我们可以通过Dependency Injection(依赖注入)设计模式来解决这一问题

 

关于Unity的一个简单使用就到这里了,希望能够对大家有用。使用Unity简单来说分为创建容器、注册接口映射、获取对象实例这样三步

 

Prefix除了分隔复杂类型的属性之外,还有一个重要的作用,就是当Action有多个参数的时候,可以指定其中一个参数的前缀,从而区分开两个参数的值,例如下面的表单:

<form action="@Url.Action("Multiple")" method="post">
    <fieldset>
        <legend>Address A</legend>
        City: <input type="text" name="City" />
        Street: <input type="text" name="Street" />
    </fieldset>
    <fieldset>
        <legend>Address B</legend>
        City: <input type="text" name="B.City" />
        Street: <input type="text" name="B.Street" />
    </fieldset>
     <input type="submit" value="OK" />
</form>

在表单中通过前缀B来区分,对应的在action方法中:

public string Multiple(Address addr1,[Bind(Prefix="B")]Address addr2)
        {
            return addr1.City + " " + addr1.Street + " B:" + addr2.City + addr2.Street;
        }
posted on 2012-01-04 16:31  cw_volcano  阅读(264)  评论(0编辑  收藏  举报