ASP.NET MVC 开发总结

一些开发过程中发现的技巧/问题汇总

字典的初始化

  • 在new字典时,可以直接使用类似
    Dictionary<int, string> dic = new Dictionary<int, string> {
        { 0, "全部" }
    };

    的方式初始化字典,而不用新建字典后使用Add()方法逐条添加

DropDownList的使用

  • 首先需要在Controller中准备使用的数据(使用ViewBag或ViewData等方式让前端拿到数据)
    var departs = db.Depart.Select(x => x);
        foreach (var i in departs) {
            dic.Add(i.ID, i.Name);
        }
    ViewBag.Depart = dic;
    ViewBag.SearchByDepart = new SelectList(dic, "Key", "Value");
  • 如上代码,在SelectList()方法中,后两个参数是指定DropDownList的显示文字和对应值的。在这个页面中我需要用到一个字典以及一个DropDownList,而DropDownList的显示文字和对应值正好与字典的Key和Value的映射相反(需要Value-Key映射)。我初始的方法是再建立一个键和值颠倒的反字典revdic,后来发现用过交换SelectList()的后两个参数,将原字典dic的Value作为显示文字,Key作为值即可。
  • 然后编辑前端,将ViewBag中的数据绑定到DropDownList
    @Html.DropDownList("SearchByDepart", ViewBag.SearchByDepart as SelectList, new { @class = "btn btn-default dropdown-toggle" })
  • 这里使用了重载了三个参数的方法(使用样式表),其中如果第一个参数的值与ViewBag里的数据索引相同,则第二个参数传入null也是可以的,因为那样会自动使用ViewBag中的数据索引。

一个显示倒计时秒数的自动跳转页面

  • 首先在前端嵌入C#代码,实现倒计时数秒后自动跳转页面(此时不显示秒数)
    @{
        Response.Write("<meta http-equiv='refresh' content='3; url=/Home' />"); @*3秒后自动跳转到Home*@
    }
  • 然后加入js,实现显示倒计时秒数
    <body>
        <form id="form1" runat="server">
            <div id='div1'>
            </div>
        </form>
    </body>
    
    <script type="text/javascript">
        var t = 4;
        function showTime() {
            t -= 1;
            document.getElementById('div1').innerHTML = t + " 秒后跳转至主页";
            setTimeout("showTime()", 1000);
        }
        showTime();
    </script>

Lambda表达式

  • 还没有深究lambda表达式的深层意义,只是在数据库操作时用到,如下,在数据库中查找指定ID的条目
    var res = db.Teacher.Single(x => x.ID == "00000000");

    其中“x => x.ID == “00000000””的含义等同于“一个条目x,其ID等于00000000”

从前端返回数据到后端

  • GET
    • 使用GET方法返回的数据,在客户端url中会有显示(?后面的参数)
    • 先在前端中嵌入C#代码,使用GET方法提交表单
      @using (Html.BeginForm("ShowAll", "Home", FormMethod.Get)) { }

      其中BeginForm()的第一个参数是表单提交对应的Action,第二个参数是Action对应的Controller

    • 然后在后端接收表单传来的值
      public ActionResult ShowAll(string ID = null, string Name = null, int SearchByDepart = 0, string sortBy = "none", bool ShowCheck=false) { }

      参数名与空间name相同会自动赋值,打乱参数顺序不会影响数值的获取

  • POST
    • POST方法不会显示在地址栏中
    • 与GET方法不同的一点,需要在方法前加“[HttpPost]”

从后端传数据到前端

  • 个人用到的两种方法
    1. 使用ViewBag、ViewData
    2. 在前端页面引入model,后端return View()时传入对应model的对象

后端自定方法中跳转页面的问题

  • 开发中需要网站使用Session检查用户是否登陆,如果没有登录则跳转至登录界面。一开始写了一个私有方法(void返回类型),把各个Action共有的一些操作放到里面,长这样:
    private void CommonWork() {
        if (Session["userID"] == null) {
            RedirectToAction("Index", "Login");
        }
        ...
    }
  • 测试时发现未登录时访问页面也会执行后续代码,但RedirectToAction()也执行了,debug了一段时间。
  • 最后意识到如果想要页面什么都不做,直接返回到登录界面,需要在Action方法中 return 才可以。私有方法中RedirectToAction()并不会直接结束方法。
  • 总之,这个bug写的非常sb

EF写入数据库的验证问题

  • 为了熟悉数据库操作,在YouTube上看了一个印度人的讲解视频。一番咖喱操作之后,我的实体模型里加了一堆数据库中并不存在的属性,这大概(有可能是别的原因)引发了我在数据库更新操作时的验证失败(那些不存在的属性牵扯了太多功能,没办法说改就改)。
  • 在使用如下代码取消数据库上下文的验证后,实测可以插入数据(好像没出现什么问题)
    db.Configuration.ValidateOnSaveEnabled = false;
    db.SaveChanges();
    db.Configuration.ValidateOnSaveEnabled = true;