在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<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值拼接作为元素的idvar 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 citiesselect 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)<input type="submit" value="提交"/>}
火柴人忍者3v3M0D版内置功能菜单 v5.5
下载重生细胞腾讯版 安卓版v3.5.2-bilibili-UO
下载拳皇命运体验服 最新免费版v2.31.000
下载地牢杀手无限生命版 内置修改器最新版v0.707.12
下载天天爱烹饪 安卓版1.1.1
天天爱烹饪是由润谦科技游戏厂商出品的美食烹饪餐厅模拟经营休闲
我的世界RLCraft任务汉化版 安卓版v2.9.1
我的世界RLCraft任务汉化版是一个非常有趣的整合包,游戏
光与夜之恋内测版 最新版v1.8.0803
光与夜之恋是一款女性向恋爱养成游戏,精美的画面,丰富的剧情故
光与夜之恋台服 安卓版v1.8.0803
光与夜之恋是一款高品质恋爱互动式养成游戏,超一线画师及豪华编
俄罗斯乡村模拟器3D 手机版v1.8.2
俄罗斯乡村模拟器(Russian Village Simul