1.Controller类引用的View会自动的对应到Views/XXX目录中寻找。
其中Views/Shared存放共享的试图模板。
搜索顺序:
首先搜索/Views/[Controller],如果找不到,再开始查找Views/Shared子目录。
2.
建议:视图的模板名称和Action引用的方法名称相同。
这样的话,开发人员就可以省略View Template的名称。
比如:return View("Details", dinner) 可以简化为View(dinner)。
public ActionResult Details(int id)
{
//Response.Write("<h1>Details DinnerID: " + id + "</h1>");
Dinner dinner = dinnerRepository.GetDinner(id);
return dinner != null? View(dinner) : View("NotFound");
}
3. 实现HTTP-GET的Action方法
用HTML.BeginForm()和HTML.EndForm()来生成HTML form元素.
<form action="/Dinners/edit/1" method="post"></form>
4.实现HTTP-POST的Action 方法.
添加[AcceptVerbs(HttpVerbs.Post)].
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues) {
...
}
获取表单参数,并且自动更新的简单方法:UpdateModel(Dinner)
5.异常处理可以通过ModelState来实现.
try {
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
foreach (var issue in dinner.GetRuleViolations()) {
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
6. 从Controller传递数据到View视图模板
MVC
模式一个典型的特征是严格的功能隔离。Model 模型、Controller 控制器和View 视图各自定义了作
用和职责,且相互之间以定义好的方式进行沟通。这有助于提升测试性和代码重用。
当
Controller 决定呈现HTML 响应给客户端是,它负责显式传递给View 模板所有需要的数据。View 模板
从不执行任何数据查询或应用程序逻辑 – 仅仅负责呈现
Model 或Controller 传递过来的数据。
1)
Controller:
使用ViewData字典 [ Authorize ] publicActionResult Edit(int id) {
Dinner dinner = dinnerRepository.GetDinner(id);
ViewData[
"Countries"] = new SelectList(PhoneValidator.AllCountries, dinner.Country);return
View(dinner);
然后在View里面:
Edit.aspx 视图模板,使用Html.DropDownList() 辅助方法代码Html.TextBox()
辅助方法:
<%
= Html.DropDownList("Country", ViewData["Countries"] as SelectList ) %>
同时在HTTP POST Edit 方法中Catch更新ViewData[""];
2)使用ViewModel模式:
需要针对特定的
View 创建强类型的类,
公开
View 模板需要的动态参数值或内容。Controller 类接着填充和传递这些类给View 模板去使用。这
样可以实现类型安全、编译期间检查和编辑器智能提示等等。
1)创建ViewModel类,
public class DinnerFormViewModel
{
// Properties
public
// Constructor
public
Dinner = dinner;
Countries =
DinnerFormViewModel(Dinner dinner) { new SelectList(PhoneValidator.AllCountries, dinner.Country); public Dinner Dinner { get ; private set ; } SelectList Countries { get ; private set ; }}
2)更新Action方法
[Authorize]public ActionResult Edit(int id) {
Dinner
return
View( new DinnerFormViewModel(dinner)); dinner = dinnerRepository.GetDinner(id);3)更新模板以及HTML页面
更新Inherits属性:
Inherits="System.Web.Mvc.ViewPage
<xxx.Controllers.yyyyViewModel>
(<%=Html.TextBox("Longitude",Model.Dinner.Longitude) %>)