当使用.net MVC RadioButtonFor(),你如何分组,所以只能做出一个select?
这一个有我难住,我有一个强types的看法,有这个循环来生成单选button:
<% foreach (QuestionAnswer qa in Model.QuestionAnswers) { %> <%= Html.RadioButtonFor(model => model.QuestionAnswers[(int)qa.QuestionID - 1].AnswerValue, "Checked" ) %> <%= Html.Encode(qa.OptionValue) %> <% } %>
它渲染得很好,但由于名称不一样,所以可以select多个单选button。 我如何分组,所以只能select1个单选button?
任何帮助,将不胜感激!
Html.RadioButtonFor()的第一个参数应该是您正在使用的属性名称,第二个参数应该是该特定单选button的值。 然后它们将具有相同的名称属性值,当/如果匹配属性值,助手将select给定的单选button。
例:
<div class="editor-field"> <%= Html.RadioButtonFor(m => m.Gender, "M" ) %> Male <%= Html.RadioButtonFor(m => m.Gender, "F" ) %> Female </div>
这里有一个更具体的例子:
我做了一个名为“DeleteMeQuestion”(DeleteMe前缀的快速MVC项目,所以我知道我可以在忘记它之后将其删除)。
我做了以下模型:
namespace DeleteMeQuestion.Models { public class QuizModel { public int ParentQuestionId { get; set; } public int QuestionId { get; set; } public string QuestionDisplayText { get; set; } public List<Response> Responses { get; set; } [Range(1,999, ErrorMessage = "Please choose a response.")] public int SelectedResponse { get; set; } } public class Response { public int ResponseId { get; set; } public int ChildQuestionId { get; set; } public string ResponseDisplayText { get; set; } } }
模型中有一个简单的范围validation器,只是为了好玩。 接下来,我做了以下控制器:
namespace DeleteMeQuestion.Controllers { [HandleError] public class HomeController : Controller { public ActionResult Index(int? id) { // TODO: get question to show based on method parameter var model = GetModel(id); return View(model); } [HttpPost] public ActionResult Index(int? id, QuizModel model) { if (!ModelState.IsValid) { var freshModel = GetModel(id); return View(freshModel); } // TODO: save selected answer in database // TODO: get next question based on selected answer (hard coded to 999 for now) var nextQuestionId = 999; return RedirectToAction("Index", "Home", new {id = nextQuestionId}); } private QuizModel GetModel(int? questionId) { // just a stub, in lieu of a database var model = new QuizModel { QuestionDisplayText = questionId.HasValue ? "And so on..." : "What is your favorite color?", QuestionId = 1, Responses = new List<Response> { new Response { ChildQuestionId = 2, ResponseId = 1, ResponseDisplayText = "Red" }, new Response { ChildQuestionId = 3, ResponseId = 2, ResponseDisplayText = "Blue" }, new Response { ChildQuestionId = 4, ResponseId = 3, ResponseDisplayText = "Green" }, } }; return model; } } }
最后,我提出了以下看法:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DeleteMeQuestion.Models.QuizModel>" %> <asp:Content ContentPlaceHolderID="TitleContent" runat="server"> Home Page </asp:Content> <asp:Content ContentPlaceHolderID="MainContent" runat="server"> <% using (Html.BeginForm()) { %> <div> <h1><%: Model.QuestionDisplayText %></h1> <div> <ul> <% foreach (var item in Model.Responses) { %> <li> <%= Html.RadioButtonFor(m => m.SelectedResponse, item.ResponseId, new {id="Response" + item.ResponseId}) %> <label for="Response<%: item.ResponseId %>"><%: item.ResponseDisplayText %></label> </li> <% } %> </ul> <%= Html.ValidationMessageFor(m => m.SelectedResponse) %> </div> <input type="submit" value="Submit" /> <% } %> </asp:Content>
根据我的理解,您可以通过一系列可用的答案来解答问题。 每个答案都会决定下一个问题。 希望这从我的模型和TODO评论是有道理的。
这给你单选button具有相同的名称属性,但不同的ID属性。
就我而言,我有一个需要在一个组中的单选button的集合。 我只是在模型中包含了一个“选定”属性。 然后,在循环输出单选button只是做…
@Html.RadioButtonFor(m => Model.Selected, Model.Categories[i].Title)
这样,所有单选button的名称都是相同的。 当表单发布时,“Selected”属性等于类别标题(或ID或任何),这可以用来更新相关单选button上的绑定,像这样…
model.Categories.Find(m => m.Title.Equals(model.Selected)).Selected = true;
可能不是最好的方法,但它确实有效。
在name属性不同的情况下,通过JQuery控制广播组是最容易的。 select一个选项时,使用JQuery取消select其他选项。