一个简单的数据弹框更改功能

  项目中因为某个页面的数据太多,容易使页面看起来比较杂乱,所以我们分成了A、B、C等的各个小块来显示,不过这样的数据显示修改起来是很麻烦的,需要将整个页面的数据

传回服务器,比较浪费资源。顺理成章的我们想到了对每一个小块进行分别编辑,比如点击A小块,A小块的内容弹出编辑对话框,编辑完后保存,对话框消失,然后在编辑B小块。

效果图如下:

  

  说起来很容易,做起来并不简单,下面我们一起来看看怎么实现吧!

  <1>我自己构造了三张表(Person、School、Company),插入一条简单的数据作为测试。

  <2>我构建了一个VM_Person来获取所有的Person数据传递到页面,分Person、School、Company三大块显示。

  <3>每一小块构建两个PartialView,一个用来显示,一个用来编辑。然后把这几块组合到一个页面中。这里注意我将<input type="button" id="PersonEdit"

value="Edit">放在了PartialView的外面,如果将按钮放在PartialView里面的话,第一次编辑操作之后这个按钮就不工作了。(这里可以将button放到partialview里面去,但同时将下面要讲到的弹出对话框的相关代码都放到partialview里面就可以了,我做项目的时候因为对话框太多,并没有即使的将各个对话框对应的JQuery代码放到相应的partialview里,才出现了编辑按钮只工作一次的情况。2013-4-25 1:40分改)

@model DialogOperate.Models.VM_Person

@{
    ViewBag.Title = "Details";
}

<table style="width:100%;">
    <tr>
        <td>
            <fieldset>
                <legend>Person</legend>
                    @{Html.RenderPartial("_D_Person", Model);}
                    <input  type="button" id="PersonEdit" value="Edit"/>
                </fieldset>
        </td>
    </tr>
    <tr>
        <td>
            <fieldset>
                <legend>Company</legend>
                    @{Html.RenderPartial("_D_Company", Model);}
                </fieldset>
        </td>
    </tr>
    <tr>
        <td>
            <fieldset>
                <legend>School</legend>
                    @{Html.RenderPartial("_D_School", Model);}
                </fieldset>
        </td>
    </tr>
</table>

@{Html.RenderPartial("_E_Person", Model);}
@{Html.RenderPartial("_E_Company", Model);}
@{Html.RenderPartial("_E_School", Model);}

 

  

  <4>下来我们需要做出简单的弹框效果

     首先添加要引用的js文件     

  <!--Jquery 皮肤-->
    <link href="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.10.2/themes/redmond/jquery-ui.css" rel="stylesheet" type="text/css" />
    <!--Jquery 1.7.2-->
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
    <!--Jquery UI 1.10.2-->
    <script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.10.2/jquery-ui.min.js" type="text/javascript"></script>    

     我们先把下面的三个编辑框变成对话框,让他们隐藏,然后在点击Edit的时候,弹出显示框对于的对话框。    

    //Person
    //将Person的编辑框变成对话框,隐藏
    $("#PersonEditTable").dialog({
        autoOpen: false,
        height: 500,
        width: 550,
        modal: true,
        show: {
            effect: "blind",
            duration: 1000
        },
        hide: {
            effect: "explode",
            duration: 1000
        }
    });
    //点击编辑 弹出 对话框
    $("#PersonEdit").click(function () {
        $("#PersonEditTable").dialog("open");
    });

   <5>现在弹框效果已经有了,然后我们需要做的是在我们保持修改的数据的时候,异步刷新被修改的对话框对应的显示框。这里用到了MVC中的AJAX帮助方法。

      首先要添加一个js文件,这个在生成MVC项目的时候都会被加载进来。只有添加了这个,我们在使用AJAX的时候在能起作用。      

    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"></script>

         以Person为例。现在我们需要对_D_Person(View)进行一下修改,代码即注释如下:这里要注意的是<div id="PersonEditTable">这里的id是我们要弹出的对话框的

id,我们要保证Ajax代码在这个div内部,代码才能工作。如果将id添加到table上,Ajax代码就不工作了。           

<div id="PersonEditTable">
    <!--PersonModify        actionName-->
    <!--new{id=Model.Id}    避免每个页面都要添加一个 hideInput来存id,这里将id作为参数传给对于的action-->
    <!--UpdateTargetId      异步操作要更新的目标Id,这里用的是_D_Person的Table的Id,更新他的显示数据-->
    @using (Ajax.BeginForm("PersonModify", new { id = Model.Id }, new AjaxOptions
    {            
             UpdateTargetId = "PersonDisplayTable"        
    }))
    {
    <table  title="Person">
       ..........
    </table>
    }
</div>

     然后去controller里添加我们的 PersonModify Action(Controller)     

public ActionResult PersonModify(VM_Person person,int id)
        { 
            //这里是对象修改的代码,不同的地方可能不太一样,你的项目和我的可能不同,所以不多做讲解
            Person p=new Person{
                Id=id,
                Name=person.Name,
                Age =person.Age,
                Country =person.Country,
                Phone  =person.Phone
            };
            db.Entry(p).State = EntityState.Modified;
            db.SaveChanges();

            //这里的return是重点,我们return了一个PartialView,model的类型是VM_Person,这里的model就是我们要修改的数据的实例,这样_D_Person就接受到了我们改变的数据了
            //这里存在一个问题,就是数据在数据库的修改 和 更改后的数据的显示 分开了,这就可能出现 即使没修改成功,显示的数据也会改变的情况,这个后面有解决办法。
            return PartialView("_D_Person",person);
        }

       下面我们来说一下关于数据验证的问题,其实也并不复杂,我们需要在我们的VM_Person上添加我们的验证信息,然后再在页面上做验证就好了。注意这里是在

VM_Person而不是Person。这里的添加要和数据库对应。

       首先添加两个script,不知道为什么加这两个,但是不加不工作。     

  <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js" type="text/javascript"></script>
    <script src="http://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

       我们为Name添加一个特性    

     [StringLength(10)]
        public string Name { get; set; }

      在页面_E_Person上添加验证:      

    @Html.ValidationMessageFor(x=>Model.Name)

      效果如下:这样用户的数据不通过验证的话,是没办法提交的。    

   最后我们在为Ajax.BeginForm方法的AjaxOptions添加OnSuccess事件,让成功修改数据之后,对话框关闭就OK了。操作方法如下:    

OnSuccess="success"  
.........
<script>
    function success()
    {
        $("#PersonEditTable").dialog("close");
    }
</script>

 

 

    

posted @ 2013-04-23 18:20  小飞的DD  阅读(1823)  评论(0编辑  收藏  举报