一棵树

路漫漫其修远兮 吾将上下而求索。

导航

mvc5来自葡萄城总结

1:

 第一部分的 URL 确定哪个控制器类会被执行。因此 /HelloWorld 映射到
HelloWorldController 控制器类。
 第二部分的 URL 确定要执行控制器类中的那个操作方法。因此
/HelloWorld/Index,会使得 HelloWorldController 控制器类的 Index 方法被执行。
请注意,我们只需要浏览 /HelloWorld 路径,默认情况下会调用 Index 方法。如果没
有明确的指定操作方法,Index 方法会默认的被控制器类调用。
 第三部分的 URL 段(Parameters 参数)是路由数据。在本教程中,稍后我们将看到
路由数据。

让我们稍微修改一下这个例子,以便可以使用 URL 传递一些参数信息给控制器类(例如
, /HelloWorld/Welcome?name=Scott&numtimes=4)。改变您的 Welcome 方法来包含
两个参数,如下所示。需要注意的是,示例代码使用了 C#语言的可选参数功能,
numTimes 参数在不传值时,默认值为 1。
public string Welcome(string name, int numTimes = 1) {
return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}
安全注意事项: 上面的代码使用了 HttpServerUtility.HtmlEncode 来保护应用从 malacious
输入的(也就是 JavaScript). 有关详细信息,请参阅 How to: Protect Against Script Exploits
in a Web Application by Applying HTML Encoding to Strings.

routes.MapRoute(
name: "Hello",
url: "{controller}/{action}/{name}/{id}"
); 访问的路径:运用应用程序,在浏览器输入:/localhost:XXX/HelloWorld/Welcome/Scott/3.

2:

将数据从控制器传递给视图
在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。
控制器类将响应请求来的 URL。控制器类是给您写代码来处理传入请求的地方,并从数据
库中检索数据,并最终决定什么类型的返回结果会发送回浏览器。视图模板可以被控制器
用来产生格式化过的 HTML 从而返回给浏览器。
控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来 Render 返
回给浏览器的 HTML。最佳做法是:一个视图模板应该永远不会执行业务逻辑或者直接和数据
库进行交互。相应的,一个视图模板应该只和控制器所提供的数据进行交互。维持这种"隔
离关系"可以帮助,保持代码的干净、测试性和更易维护。

打开 HelloWorldController.cs 文件,更改 Welcome 方法,将 Message 和 NumTimes 的值
添加到 ViewBag 对象里。ViewBag 是一个动态的对象,这意味着在您没有给 ViewBag 放
置属性时,它没有任何属性,您可以把任何您想放置的对象放入到 ViewBag 对象中
。 ASP.NET MVC model binding system 会自动将地址栏中 URL 里的 query string 映射
到您方法中的参数(name 和 numTimes)。

现在,模型绑定(model binder) 使得数据从 URL 传递给控制器。控制器将数据装入到 ViewBag
对象中,通过该对象传递给视图。然后视图为用户生成显示所需的 HTML。

3:

Details 方法如下所示。
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
id 参数一般是通过路由数据传递. 例如 http://localhost:1234/movies/details/1 会设置
电影控制器的控制,该方法操作 details 并设置 id 为 1。 你也可以通过一个查询字符串
(query string) 的 id 如下: http://localhost:1234/movies/details?id=1

4:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="ID,Title,ReleaseDate,Genre,Price")] Movie movie)
{

if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
注意,第二个 Edit 操作方法的上面有 HttpPost 属性。此属性指定了 Edit 方法的重载,此方法仅
被 POST 请求所调用。您可以将 HttpGet 属性应用于第一个编辑方法,但这是不必要的,因为它
是默认的属性。(操作方法会被隐式的指定为 HttpGet 属性,从而作为 HttpGet 方法。) 绑定
(Bind)属性是另一个重要安全机制,可以防止黑客攻击(从 over-posting 数据到你的模型)。您
应该只包含在 bind 属性属性,您想要更改。您可以阅读有关在我 overposting security note。我
们将在本教程中使用的简单模型,模型中绑定所有数据。ValidateAntiForgeryToken 属性是用来防
止伪造的请求,并配对@Html.AntiForgeryToken()文件 (Views\Movies\Edit.cshtml),如下图所
示,部分在编辑 view 文件:

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.ID)
<div class="form-group">
@Html.LabelFor(model => model.Title, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)

5:dropdownlist

var GenreLst = new List<string>();
var GenreQry = from d in db.Movies
orderby d.Genre
select d.Genre;
GenreLst.AddRange(GenreQry.Distinct());
ViewBag.movieGenre = new SelectList(GenreLst);

页面:Genre: @Html.DropDownList("movieGenre", "All")

6:

将删除数据的 HttpPost 方法命名为唯一签名或名称的 DeleteConfirmed 方法。这两个方
法的签名如下所示:
// GET: /Movies/Delete/5
public ActionResult Delete(int? id)
//
// POST: /Movies/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)

公共语言运行时 (CLR)重载方法时,需要方法具有独特唯一的签名 (方法名称相同但不同
的参数列表)。但是,在这里您需要两种删除方法 — — 一个 GET 方法和一个 POST 方
法它们都具有相同的签名。(他们都需要接受一个整数作为参数)。
要解决这一点,可以有几种办法。一是使用不同的方法名称。这是框架代码在前面的示例
中所使用的方法。然而,这就带来了一个小问题: ASP.NET 将部分的 URL 按名称映射到
操作方法,如果您重命名了方法,通常 Routing 将无法找到该方法。解决方法是您在示
例中看到的,将 ActionName("Delete")属性添加到 DeleteConfirmed 方法。这会有效的执
行 Routing 系统的 Url 映射,这样一个包含/Delete/的 POST 请求的 URL 将找到
DeleteConfirmed 方法。
另一个常见的方法,来避免具有相同名称和签名的方法,是人为地改变 POST 方法,包括
未使用参数的签名。例如,有些开发人员添加参数类型 FormCollection,FormCollection
是会传递给 POST 方法的,然后根本不使用此参数:

public ActionResult Delete(FormCollection fcNotUsed, int id = 0)

posted on 2014-11-25 11:02  nxp  阅读(93)  评论(0)    收藏  举报