2010-06-24 29 views
61

Cái này đã cho tôi bối rối, tôi có một cái nhìn mạnh mẽ gõ có vòng lặp này để tạo radiobutton:Khi sử dụng .net MVC RadioButtonFor(), làm thế nào để bạn nhóm để chỉ có một lựa chọn có thể được thực hiện?

<% foreach (QuestionAnswer qa in Model.QuestionAnswers) 
    { %> 
    <%= Html.RadioButtonFor(model => model.QuestionAnswers[(int)qa.QuestionID - 1].AnswerValue, "Checked") %> 
    <%= Html.Encode(qa.OptionValue) %> 
<% } %> 

Nó ám tốt, nhưng kể từ khi tên không giống nhau, bạn có thể chọn nhiều hơn 1 RadioButton. Làm thế nào tôi có thể nhóm chúng để chỉ có thể chọn 1 radio?

Mọi trợ giúp sẽ được đánh giá cao!

+0

Tại sao bạn không thể sử dụng 'Html.RadioButton' thay thế? – Ahmad

+3

Vì đây là chế độ xem mạnh mẽ nên tôi đang cố gắng tạo ra dữ liệu để dữ liệu trở lại được điền vào bộ điều khiển. Tôi đang mở cho bất kỳ đề xuất nào! –

Trả lời

112

Tham số đầu tiên của Html.RadioButtonFor() phải là tên thuộc tính bạn đang sử dụng và tham số thứ hai phải là giá trị của nút radio cụ thể đó. Sau đó, chúng sẽ có cùng giá trị thuộc tính name và helper sẽ chọn nút radio đã cho khi/nếu nó khớp với giá trị thuộc tính.

Ví dụ:

<div class="editor-field"> 
    <%= Html.RadioButtonFor(m => m.Gender, "M") %> Male 
    <%= Html.RadioButtonFor(m => m.Gender, "F") %> Female 
</div> 

Dưới đây là một ví dụ cụ thể hơn:

tôi đã thực hiện một dự án MVC nhanh chóng có tên là "DeleteMeQuestion" (DeleteMe tiền tố vì vậy tôi biết rằng tôi có thể loại bỏ nó sau này sau khi Tôi quên nó đi.

tôi đã thực hiện mô hình sau:

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; } 
    } 
} 

Có một validator phạm vi đơn giản trong mô hình, chỉ để cho vui. Tiếp theo, tôi đã thực hiện bộ điều khiển sau:

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; 
     } 
    } 
} 

Cuối cùng, tôi đã nhìn sau mà làm cho việc sử dụng mô hình:

<%@ 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> 

Như tôi hiểu hoàn cảnh của bạn, bạn có thắc mắc với một danh sách câu trả lời có sẵn. Mỗi câu trả lời sẽ quyết định câu hỏi tiếp theo. Hy vọng rằng có ý nghĩa từ mô hình của tôi và nhận xét TODO.

Nút này cung cấp cho bạn các nút radio có cùng thuộc tính tên nhưng thuộc tính ID khác nhau.

+0

Cảm ơn Andrew, nhưng tôi nghĩ rằng trường tên đang gây ra vấn đề vì nó là một phần của vòng lặp. Khi tôi nhìn vào nguồn, nó cho thấy AnswerValue [1], AnswerValue [2], vv ... Để có thể trả lại kết quả được đánh máy mạnh mẽ, việc đặt tên này là cần thiết (tôi muốn lưu trữ mỗi nút radio trong chính nó cánh đồng). Chỉ cần tự hỏi nếu có bất kỳ cách nào để làm cho chỉ có một chức năng lựa chọn duy nhất. –

+0

Bạn có thể chia sẻ một phiên bản mỏng về định nghĩa và mục đích của mô hình lớp học của bạn không? Vòng lặp mã của bạn có được tạo bằng các nút radio cho một câu hỏi duy nhất và tất cả các câu trả lời của nó không? Thuộc tính nào lưu trữ giá trị đã chọn? Những thứ như thế sẽ giúp mô tả những gì bạn muốn làm. – a7drew

+0

Tôi vẫn đang trong giai đoạn phát triển, vì vậy hãy mở ra các giải pháp. Về cơ bản, chúng tôi muốn trình bày câu hỏi cho người dùng với nhiều kết quả lựa chọn được rút ra từ một DB. Mỗi kết quả cũng là một câu hỏi, với parentQuestionID là câu hỏi chính. Mô hình được rút gọn sẽ là lớp công khai QuestionAnswer {public int QuesitonID {}, chuỗi công khai QuestionText {}, chuỗi công khai OptionValue {}, chuỗi công khai AnswerValue {}. Tôi sẽ chuyển danh sách mô hình này vào. Tôi đã thêm mã vòng lặp của mình vào câu hỏi ban đầu. –

-6

Trong trường hợp thuộc tính tên khác nhau, cách dễ nhất là kiểm soát nhóm radio qua JQuery. Khi một tùy chọn được chọn, sử dụng JQuery để bỏ chọn các tùy chọn khác.

3

Trong trường hợp của tôi, tôi có một bộ sưu tập các nút radio cần thiết trong một nhóm. Tôi chỉ bao gồm thuộc tính 'Đã chọn' trong mô hình. Sau đó, trong vòng lặp xuất ra các nút vô tuyến chỉ cần thực hiện ...

@Html.RadioButtonFor(m => Model.Selected, Model.Categories[i].Title) 

Bằng cách này, tên này giống nhau cho tất cả các nút radio. Khi biểu mẫu được đăng tải, các tài sản 'chọn' là tương đương với tiêu đề mục (hoặc id hoặc bất cứ điều gì) và điều này có thể được sử dụng để cập nhật các ràng buộc đối với các radiobutton có liên quan, như thế này ...

model.Categories.Find(m => m.Title.Equals(model.Selected)).Selected = true; 

tháng không phải là cách tốt nhất, nhưng nó hoạt động.

Các vấn đề liên quan