• 在ASP.NET MVC下扩展一个带验证的RadioButtonList


    在ASP.NET MVC4中,HtmlHelper为我们提供了Html.RadioButton()方法用来显示Radio Button单选按钮。如果想显示一组单选按钮,通常的做法是遍历一个集合把每个单选按钮显示出来。本篇尝试写一个扩展方法用来展示一组带验证的单选按钮。


    1

    首先来扩展HtmlHelper,扩展方法中接收一个SelectListItem的集合,遍历这个集合把每个单选按钮显示出来,并且让这些单选按钮具有不同的id属性值。

     

    using System.Collections.Generic;
    
    using System.Linq.Expressions;
    
    using System.Text;
    
    using System.Web.Mvc.Html;
    
    namespace System.Web.Mvc
    
    {
    
        public static class HtmlExtensions 
    
        {
    
            public static MvcHtmlString RadioButtonListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, 
    
                Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> list)
    
            {
    
                //获取元数据
    
                var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    
                var sb = new StringBuilder();
    
                if (list != null)
    
                {
    
                    foreach (var item in list) 
    
                    {
    
                        //把属性名和集合元素的Value值拼接作为元素的id
    
                        var id = string.Format("{0}_{1}", metaData.PropertyName, item.Value);
    
                        //创建单选按钮
    
                        var label = htmlHelper.Label(id, HttpUtility.HtmlEncode(item.Text));
    
                        var radio = htmlHelper.RadioButtonFor(expression, item.Value, new {id = id}).ToHtmlString();
    
                        sb.AppendFormat("<div class="RadioButton">{0}{1}</div>", radio, label); 
    
                    }
    
                }
    
                return MvcHtmlString.Create(sb.ToString());
    
            }
    
        }
    
    }
    

     

     

    假设,现在有一个View Model,其中的一个属性要求必须。

     

    using System.ComponentModel.DataAnnotations;
    
    namespace MvcApplication1.Models
    
    {
    
        public class Vm
    
        {
    
            [Required(ErrorMessage = "必填")]
    
            public int CityId { get; set; }
    
        }
    
    }
    

     

    以下City类的集合将作为所有Radio Button的数据源。

     

    namespace MvcApplication1.Models
    
    {
    
        public class City
    
        {
    
            public int Id { get; set; }
    
            public string Name { get; set; }
    
        }
    
    }

    在HomeController中,提供一个Action方法啊,把City的集合转换成SelectListItem集合传递给视图。


    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Web.Mvc;
    
    using MvcApplication1.Models;
    
    namespace MvcApplication1.Controllers
    
    {
    
        public class HomeController : Controller
    
        {
    
            public ActionResult Index()
    
            {
    
                List<City> cities = new List<City>()
    
                {
    
                    new City(){Id = 1, Name = "青岛"},
    
                    new City(){Id = 2, Name = "济南"},
    
                    new City(){Id = 3, Name = "平度"}
    
                };
    
                ViewData["c"] = from c in cities
    
                    select new SelectListItem() {Text = c.Name, Value = c.Id.ToString()};
    
                return View(new Vm());
    
            }
    
            [HttpPost]
    
            public ActionResult Index(Vm vm)
    
            {
    
                if (ModelState.IsValid)
    
                {
    
                    return Content(vm.CityId.ToString());
    
                }
    
                else
    
                {
    
                    return View(vm);
    
                }
    
            }
    
        }
    
    }
    

     

    在_Layout.csthml中,必须具备客户端验证js。

     

    <head>
    
        <meta charset="utf-8" />
    
        <meta name="viewport" content="width=device-width" />
    
        <title>@ViewBag.Title</title>
    
        @Styles.Render("~/Content/css")
    
        @Scripts.Render("~/bundles/jquery")
    
        @Scripts.Render("~/bundles/jqueryval")
    
    </head>
    
    <body>
    
        @RenderBody()
    
        
    
        @RenderSection("scripts", required: false)
    
    </body>
    

     

    在Home/Index.chtml中,使用扩展方法显示Radio Button组。

     

    @model MvcApplication1.Models.Vm
    
    @{
    
        ViewBag.Title = "Index";
    
        Layout = "~/Views/Shared/_Layout.cshtml";
    
    }
    
    <style type="text/css">
    
        
    
        .RadioButton { float:left; }
    
    </style>
    
    @using (Html.BeginForm("Index", "Home", FormMethod.Post, new {id = "addForm"}))
    
    {
    
        @Html.RadioButtonListFor(v => v.CityId, ViewData["c"] as IEnumerable<SelectListItem>)
    
        @Html.ValidationMessageFor(v => v.CityId)
    
        <br/><br/>
    
        <input type="submit" value="提交"/>
    
    }
    
  • 相关阅读:
    如何规范.net中的js开发(2)
    网站架构之缓存应用(2)
    基于插件式开发的软件项目
    基于NHibernate的UnitOfWork+Repository模式(AutoFac)
    基于NHibernate的UnitOfWork+Repository模式(AutoFac)–P1
    云计算从基础到应用架构系列虚拟化的技术(上)
    Razor试图引擎 语法学习(一)
    ASP.NET页面的字符编码设置
    资源1
    Razor试图引擎 语法学习(二)
  • 原文地址:https://www.cnblogs.com/darrenji/p/4199391.html
Copyright © 2020-2023  润新知