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

首先来扩展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(this HtmlHelper htmlHelper,             Expression<Func> expression, IEnumerable 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("{0}{1}", 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 cities = new List()            {                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。

            @ViewBag.Title    @Styles.Render("~/Content/css")    @Scripts.Render("~/bundles/jquery")    @Scripts.Render("~/bundles/jqueryval")    @RenderBody()        @RenderSection("scripts", required: false)

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

@model MvcApplication1.Models.Vm@{    ViewBag.Title = "Index";    Layout = "~/Views/Shared/_Layout.cshtml";}        .RadioButton { float:left; }@using (Html.BeginForm("Index", "Home", FormMethod.Post, new {id = "addForm"})){    @Html.RadioButtonListFor(v => v.CityId, ViewData["c"] as IEnumerable)    @Html.ValidationMessageFor(v => v.CityId)        }

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接