ASP.NET MVC CheckBoxList 的使用(续)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > ASP.NET MVC CheckBoxList 的使用(续)

ASP.NET MVC CheckBoxList 的使用(续)

 2013/12/6 19:26:21  Jetlian  博客园  我要评论(0)
  • 摘要:今天在项目中有这么一个需求:“用户可以选择自己关注的文章分类,文章分类又分两级”。在网上参考了w809026418的“ASP.NETMVC3CheckBoxList的使用”,里面原理讲的很清楚,这里不再说了。但并不能完全满足我的需求,所以在他基础上进行了修改和扩展。1、首先在Controller中的Index,获取用户已经选择的文章分类和全部文章分类进行对应。publicActionResultIndex(){varuserId=newGuid
  • 标签:.net ASP.NET MVC 使用 list net

今天在项目中有这么一个需求:“用户可以选择自己关注的文章分类,文章分类又分两级”。

在网上参考了 w809026418 的“ASP.NET MVC 3 CheckBoxList 的使用”,里面原理讲的很清楚,这里不再说了。但并不能完全满足我的需求,所以在他基础上进行了修改和扩展。

 

1、首先在Controller中的Index,获取用户已经选择的文章分类和全部文章分类进行对应。

class="brush:csharp;gutter:true;">public ActionResult Index()
        {
            var userId = new Guid("f7fc34332c2242b2b357307980d26fa7");            
	    // 获取用户已经选择的文章分类	
            var focusCategories = focusCategoryService.GetFocusedCategoriesByUser(userId);
	    // 获取全部文章分类
            var documentCategories = documentCategoryService.GetAll();
	    // 构建文章层级
            ViewBag.DocumentCategories = new DocumentCategorySelectListItem().GetDocumentCategory(documentCategories, focusCategories);

            return View();
        }

 

2、扩展SelectListItem,将文章分类子节点做成二级项,里面还包括一个方法将用户已选择的文章分类属性 Selected = true 

 public class DocumentCategorySelectListItem : SelectListItem
    {
        /// <summary>
        /// 子节点
        /// </summary>
        public IEnumerable<SelectListItem> ChildItems { get; set; }

        /// <summary>
        /// 构建文章层级,并将用户已选择的文章分类Selected=true
        /// </summary>
        /// <param name="documentCategories">所有文档分类</param>
        /// <param name="focusCategories">关注文档分类</param>
        /// <returns>返回前台需要CheckList</returns>
        public IEnumerable<DocumentCategorySelectListItem> GetDocumentCategory(IEnumerable<DocumentCategoryDTO> documentCategories, IEnumerable<DocumentCategoryDTO> focusCategories) 
        {
            var result = new List<DocumentCategorySelectListItem>();

            if (documentCategories.Any())
            {
                // 查找父节点
                foreach (var category in documentCategories.Where(d => d.PraentId == Guid.Empty))
                {
                    var documentCategorySelectListItem = new DocumentCategorySelectListItem
                    {
                        Text = category.Name,
                        Value = category.Id.ToString(),
                        // 在关注分类中查找是否存在
                        Selected = focusCategories.Where(f => f.Id == category.Id).Count() > 0
                    };

                    var childItems = new List<SelectListItem>();
                    // 查找子节点
                    var childDocumentCategories = documentCategories.Where(d => d.PraentId != Guid.Empty && d.PraentId == category.Id);
                    foreach (var childDocumentCategory in childDocumentCategories)
                    {
                        var categoryItem = new SelectListItem
                        {
                            Text = childDocumentCategory.Name,
                            Value = childDocumentCategory.Id.ToString(),
                            Selected = focusCategories.Where(f => f.Id == childDocumentCategory.Id).Count() > 0
                        };
                        childItems.Add(categoryItem);
                    }
                    documentCategorySelectListItem.ChildItems = childItems;

                    result.Add(documentCategorySelectListItem);
                }
            }
            return result;
        }
    }

 

3、在Index.cshtml做显示

<h4>文章分类:</h4>
 <div>
   @Html.CheckBoxList("DocumentCategory", (IEnumerable<DocumentCategorySelectListItem>)ViewBag.DocumentCategories)
</div>
<div  class="pull-right">
   <input type="button" id="SubmitDocumentCategory" class="click" value="提交" />
</div>

  

4、Index.cshtml 页面使用 jQuery ajax 提交数据

$('#SubmitDocumentCategory').click(function () {
    var arrs = new Array();
    var chenked = $("input[type='checkbox']:checked").val([]);
    for (var i = 0; i < chenked.length; i++) {
        arrs[i] = chenked[i].value;
    }
    $.ajax({
        url: "/FileLibrary/ModifyFocusedCategories",
        type: 'post',
        data: { "categories": arrs },
        dataType: "json",
        traditional:true,
        success: function (data) {
            alert(data.responseText);
        },
        error: function (data) {
            alert(data.responseText);
        }
    });
    return false;
});

  

5、提交给controller中的修改文章分类方法

        /// <summary>
        /// Ajax提交用户关注分类
        /// </summary>
        /// <param name="categories"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult ModifyFocusedCategories(List<string> categories)
        {
            if (Request.IsAjaxRequest())
            {
                if (categories !=null && categories.Count > 0)
                {
                    var userId = new Guid("f7fc34332c2242b2b357307980d26fa7");
                    // 修改关注分类(自己的业务方法)
                    focusCategoryService.ModifyFocusedCategories(userId, categories);
                    return Content("用户关注修改成功!");
                }
            }
            return View();
        }

  

完成!!效果如图:

 

生成的HTML代码

<div class="checkboxlist">
    <ul>
        <li>
            <input type="checkbox" name="DocumentCategory" value="4af29fad-4f43-48b9-a3df-fe01c2960d36" />社会经济发展规划
            <ul>
                <li>
                    <input type="checkbox" name="DocumentCategory" value="4af29fad-4f43-48b9-a3df-fe01c2960d37" />国民经济和社会发展五年规划</li>
                <li>
                    <input type="checkbox" name="DocumentCategory" value="cc43de4f-ef10-cf7a-1788-08d0bfa55bf0" />统计公报</li>
            </ul>
        </li>
        <li>
            <input type="checkbox" name="DocumentCategory" value="4ac54dfc-511a-c318-1788-08d0bfa55bf0" checked="chekced" />行业发展规划
            <ul>
                <li>
                    <input type="checkbox" name="DocumentCategory" value="fc0b0417-e590-c2f2-1788-08d0bfa55bf0" checked="chekced" />重点行业发展规划</li>
            </ul>
        </li>
    </ul>
</div>

 

最后遗留3个问题:

1、为什么提交后局部页面刷新了?之前选择的都没了;
2、没有做到父子节点的联动选择;
3、为什么返回的提示信息,在Error方法中弹出?

 

上一篇: Windows Azure入门教学:使用Blob Storage 下一篇: 没有下一篇了!
发表评论
用户名: 匿名