第2章 第一个MVC应用程序

知识要点:

   1.Web页面从服务器到浏览器的三步:

   第一步,视力引擎对视力文件进行解析,将代码转换成HTML标记,叫渲染

  第二步,将渲染后的HTML标记传递给客户端浏览器,叫传递

   第三步,浏览器接收到HTML后对其进行处理并呈现为Web页面,叫呈现。 

   2. 属性分类:

   类或对象的Property称为 属性

  [HttpGet]这样的Attribute称为 注解属性

   HTML元素的Attributes称为 标签属性

  3.using关键字:

   功能一:引用命名空间,例如:using System.Web.Mvc;

  功能二:回收所占用的资源,例如:用于数据库连接,以确保查询完成后尽快关闭连接;

  功能三:把一个Html.BeginForm辅助方法封装在using中,生成完整的Form表单,例如: @using (Html.BeginForm()){ //表单的内容....  }     

4.控制器和动作方法:

  在MVC体系架构中,传入的请求是由控制器处理的。控制器中的每个public方法叫动作方法。

  MVC约定把控制器都放在一个名为Controllers的文件夹中

5.路由系统:

  决定了如何把URL映射到制定的控制器和动作上。在Global.asax.cs中查看和编辑路由配置。

6.模型绑定:

  解析输入数据,并用“键/值”对填充域模型类型的属性。

7.验证:运用于域模型。

----------------------------------------------             

设计思路:

  1.显示晚会信息的主页;

  2.用来进行电子回复的表单;

  3.对表单进行验证,将显示一个“谢谢你”的页面;

  4.当完成表单时,给晚会主人发送一份电子邮件。

----------------------------------------------

学习内容:

2.1 准备:Visual Studio 2012

   2.2 创建ASP.NET MVC新项目

     “空模板”

第一个控制器:(Home)

namespace PartyInvites.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /聚会邀请/

        public ActionResult Index()
        {
            return View();
        }

    }
}

  修改:

       public string Index()
        {
            return "Hello Word";
        }

  运行查看结果。

 2.3 渲染Web页面:

 public class HomeController : Controller
    {
        //
        // GET: /聚会邀请/

        public ActionResult Index()
        {
            return View();
        }

    }

添加Index视图:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        Hello World(来自于View)
    </div>
</body>
</html>

运行查看效果。

2.3.2 添加动态输出:

   1.修改HomeController

 public ActionResult Index()
        {
           //修改代码
           int hour = DateTime.Now.Hour;
ViewBag.Greeting
= hour < 12 ? "早上好" : "下午好";
//
修改结束
return View();
        }

2.修改Index.cshtml

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
       @ViewBag.Greeting World(来自于View)
    </div>
</body>
</html>

运行查看效果。

1.显示晚会信息的主页:

<body>
    <div>
        @ViewBag.Greeting World(来自于View)
        <p>我们将举办一个很牛逼的聚会,等待你的到来^_^。<br/>
        (此处可以做一些效果好看的图片或其他信息)
        </p>
    </div>
</body>
</html>

2.在Models文件夹下添加模型类GuestResponse:

namespace PartyInvites.Models
{
    public class GuestResponse
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
        public bool? WillAttend { get; set; }
    }
}

 提示:WillAttend属性是一个nullable(可空的)bool类型,可以是 true,false,null三个值。

3.链接Action方法:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>欢迎你来参加晚会</title>
</head>
<body>
    <div>
        @ViewBag.Greeting World(来自于View)
        <p>我们将举办一个很牛逼的聚会,等待你的到来^_^。<br/>
            (此处可以做一些效果好看的图片或其他信息)
        </p>
        @Html.ActionLink("立刻加入","RsvpForm")
    </div>
</body>
</html>

4.创建 RsvpForm Action方法:

 public class HomeController : Controller
    {
        //
        // GET: /聚会邀请/

        public ActionResult Index()
        {
            //修改代码 
            int hour = DateTime.Now.Hour;
            ViewBag.Greeting = hour < 12 ? "早上好" : "下午好";
            //修改结束
            return View();
        }
       
       
        // RsvpForm Action方法
         public ViewResult RsvpForm()
        {
            return View();
        }

    }

生成解决方案,编译应用程序,才可以新建强类型视图:

@model PartyInvites.Models.GuestResponse

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>RsvpForm</title>
</head>
<body>
    <div>
        
    </div>
</body>
</html>
   讲解: @model PartyInvites.Models.GuestResponse  强类型标识
2.4.4 建立表单:
@model PartyInvites.Models.GuestResponse

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>RsvpForm</title>
</head>
<body>
    <div>
        @using (Html.BeginForm())
        {
            <p>姓名:@Html.TextBoxFor(x => x.Name)</p>
            <p>Email:@Html.TextBoxFor(x =>x.Email)</p>
            <p>电话:@Html.TextBoxFor(x => x.Phone)</p>
            <p>
                是否参加?
                @Html.DropDownListFor(x => x.WillAttend, new[]
                {
                    new SelectListItem() {Text = "我要参加", Value = bool.TrueString},
                    new SelectListItem() {Text = "我参加不了了", Value = bool.FalseString}

                }, "选择一个选项")
            </p>
            <input type="submit" value="提交信息"/>
        }
    </div>
</body>
</html>

2.4.5处理表单:

      
        // RsvpForm Action方法,响应Http的Get请求:
        [HttpGet]
         public ViewResult RsvpForm()
        {   
            return View();
        }

        // RsvpForm Action方法,响应Http的Post请求:
         [HttpPost]
        public ViewResult RsvpForm(GuestResponse guestResponse)
        {
           //todo:对晚会的主人发送Email响应
             return View("Thanks", guestResponse);
        }

   添加 Thanks 视图:

 
@model PartyInvites.Models.GuestResponse

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>致谢</title>
</head>
<body>
    <div>
        <h1>谢谢你,@Model.Name !</h1>
        @if (Model.WillAttend == true)
        {
           @:你能来真是太好的,到时候尽情畅饮!
        }
        else
        {
           @:你来不了真是太可惜了,祝你生活愉快哦! 
        }
    </div>
</body>
</html>

添加验证:

 

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PartyInvites.Models
{
    public class GuestResponse
    {
        [Required(ErrorMessage="请输入您的大名!")]
        public string Name { get; set; }

        [Required(ErrorMessage = "请输入您的Email!")]
        [RegularExpression(".+\\@.+\\..+",ErrorMessage="Email的格式不正确!哥哥,别逗我好吗?")]
        public string Email { get; set; }

        [Required(ErrorMessage = "请输入您的手机号!")]
        public string Phone { get; set; }

        [Required(ErrorMessage="请选择一个选项吧,哪怕去不了也不要紧的^_^")]
        public bool? WillAttend { get; set; }
    }
}

     提示:   验证命名空间引用:System.ComponentModel.DataAnnotations;

 检查表单验证错误:

    

    // RsvpForm Action方法,响应Http的Post请求:
         [HttpPost]
        public ViewResult RsvpForm(GuestResponse guestResponse)
        {
             if (ModelState.IsValid)
             {
                 //todo:对晚会的主人发送Email响应
                 return View("Thanks", guestResponse);
             }
             else
             {
                 //有验证错误
                 return View();
             }
          
             
        }

 视图中添加验证辅助方法:

 @using (Html.BeginForm())
        {
            @Html.ValidationSummary()
            //表单的内容
            
            <p>姓名:@Html.TextBoxFor(x => x.Name)</p>
            <p>Email:@Html.TextBoxFor(x =>x.Email)</p>
            <p>电话:@Html.TextBoxFor(x => x.Phone)</p>
            <p>
                是否参加?
                @Html.DropDownListFor(x => x.WillAttend, new[]
                {
                    new SelectListItem() {Text = "我要参加", Value = bool.TrueString},
                    new SelectListItem() {Text = "我参加不了了", Value = bool.FalseString}

                }, "选择一个选项")
            </p>
            <input type="submit" value="提交信息"/>
        }

   验证效果:

 高亮无效字段:

 项目添加Content文件夹 ,然后添加Site.css样式文件,内容如下:

.field-validation-error{color:#f00}
.field-validation-valid{display:none}
.input-validation-error{ border: 1px solid #f00;background-color: #fee;}
.input-validation-valid{ display:none}

对RsvpForm视图添加链接元素:

<head>
    <meta name="viewport" content="width=device-width" />
    <title>RsvpForm</title>
    <link href="~/Content/Site.css" rel="stylesheet" type="text/css" />
</head>

查看效果:

完成示例:

使用WebMail辅助器:thanks视图

<body>
    @{
        try
        {
            WebMail.SmtpServer = "smtp.example.com";
            WebMail.SmtpPort = 587;
            WebMail.EnableSsl = true;
            WebMail.UserName = "mySmtpUserName";
            WebMail.Password = "mySmtmPassword";
            WebMail.From = "rsvps@example.com";

            WebMail.Send("party-host@example.com", "RSVP Notification", Model.Name + " is " + ((Model.WillAttend ?? false) ? "" : "not") + " attending");
        }
        catch (Exception e)
        {
            @:<b>Sorry - we couldn't send the email to confirm your RSVP. </b>
        }
    }



<div>
    <h1>谢谢你,@Model.Name !</h1>
    @if (Model.WillAttend == true)
    {
        @:你能来真是太好的,到时候尽情畅饮!
    }
    else
    {
        @:你来不了真是太可惜了,祝你生活愉快哦! 
    }
</div>
</body>

这里要改成你的Email相关信息,只做演示。

 

转载于:https://www.cnblogs.com/wjs5943283/p/4605915.html

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值