zoukankan      html  css  js  c++  java
  • ASP.MVCNOTE

    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;
            }
  • 相关阅读:
    00-深入理解C#读书笔记说明
    00-翻译IdentityServer4的目的
    IdentityServer4-介绍大纲(译文)
    (CLR-Via-C#) 类型基础
    委托
    字符串匹配算法
    weight_decay(权重衰减)
    文本主题模型--LDA
    词义消歧
    模型融合的结合策略
  • 原文地址:https://www.cnblogs.com/cw_volcano/p/2312197.html
Copyright © 2011-2022 走看看