2013-02-16 30 views
6

Tôi đã một radiobuttonlistFor bộ chuyển đổi tùy chỉnh làm việc, nhưng nếu một người sử dụng tạo ra dữ liệu được thiết lập lại, và không có dữ liệu đã được đệ trình trước đây, một trong những nút radio (đầu tiên) luôn được chọn trước, tôi muốn tránh điều này, làm sao tôi có thể đạt được điều này?ASP.NET MVC RadioButtonListFor luôn cài sẵn

@Html.RadioButtonForSelectList(model => model.ViewModelForThingCreate.ThingTypeID, Model.ViewModelForCarCreate.CarTypeSelectList) 

và:

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> HTMLHelper,Expression<Func<TModel, TProperty>> Expression, IEnumerable<SelectListItem> ListOfValues) 
     { 
      var MetaData = ModelMetadata.FromLambdaExpression(Expression, HTMLHelper.ViewData); 
      var SB = new StringBuilder(); 

      if (ListOfValues != null) 
      { 
       foreach (SelectListItem Item in ListOfValues) 
       { 
        var ID = string.Format("{0}_{1}", MetaData.PropertyName, Item.Value); 
        var Radio = HTMLHelper.RadioButtonFor(Expression, Item.Value, new { id = ID }).ToHtmlString(); 
        SB.AppendFormat("<label class=\"radio inline\" for=\"{0}\">{1} {2}</label>", ID, Radio, HttpUtility.HtmlEncode(Item.Text)); 
       } 
      } 
      return MvcHtmlString.Create(SB.ToString()); 
     } 

Cảm ơn!

+0

bạn cảm thấy thế nào khi sử dụng j? –

+1

Đó là lúc nào cũng là phương sách cuối cùng ... – Baconbeastnz

+0

check out này trơn nút radio helper từ Darin http://stackoverflow.com/questions/9553408/custom-helper-for-generating-html-tags-for-radio-button-and -associated-label –

Trả lời

1

Tôi vừa thử phương pháp của bạn trong mẫu MVC3 và nó dường như làm việc tốt cho tôi. Về cơ bản tôi đã tạo ra một số mẫu

public class IndexModel 
{ 
    public string ID; 
    public IEnumerable<SelectListItem> Elements; 
} 

Sau đó, tạo ra ví dụ và điền giá trị:

var model = new IndexModel() 
      { 
       ID = "a", 
       Elements = 
         new List<SelectListItem>() { 
                new SelectListItem() { Text = "test1", Value = "1"}, 
                new SelectListItem() { Text = "test2", Value = "2"}} 
      }; 

Theo quan điểm của tôi đã sử dụng phương pháp mở rộng của bạn

<form> 
@(Extensions.RadioButtonForSelectList(Html, x => x.ID, Model.Elements)) 
<button type="reset">Reset</button> 
</form> 

Tất cả dường như hoàn toàn tốt đẹp sau khi ra mắt . Các trường không được chọn khi tải và chúng sẽ bị xóa sau khi nhấn nút "Reset".

enter image description here

Bạn có thể cho một số chi tiết như tôi không chắc chắn nếu tôi hoàn toàn hiểu những gì bạn đang cố gắng để đạt :-)

EDIT:

Dưới đây là ví dụ trong đồng bằng HTML của các nút radio. Họ chắc chắn không điền vào đầu và nếu bạn muốn họ được yêu cầu thêm yêu cầu nhưng theo mặc định, bạn có thể gửi biểu mẫu mà không chọn bất kỳ nút radio nào. Ngoài ra bạn có thể làm cho một kiểm tra bằng cách thêm kiểm tra như trong ví dụ thứ hai. Bạn đang sử dụng một số javascript trên phía khách hàng? Có lẽ nó đang gây ra tác dụng phụ này? http://jsbin.com/isadun/1

mz

2

Đây là helper tùy chỉnh của bạn với các nút thiết lập để không được chọn. Hãy thử điều này, tôi giả sử nó sẽ làm cho tất cả các nút radio không được kiểm soát.

public static MvcHtmlString RadioButtonForSelectList<TModel, TProperty>(this HtmlHelper<TModel> HTMLHelper,Expression<Func<TModel, TProperty>> Expression, IEnumerable<SelectListItem> ListOfValues) 
     { 
      var MetaData = ModelMetadata.FromLambdaExpression(Expression, HTMLHelper.ViewData); 
      var SB = new StringBuilder(); 

      if (ListOfValues != null) 
      { 
       foreach (SelectListItem Item in ListOfValues) 
       { 
        var ID = string.Format("{0}_{1}", MetaData.PropertyName, Item.Value); 
        var Radio = HTMLHelper.RadioButtonFor(Expression, Item.Value, new { id = ID }).ToHtmlString(); 
        SB.AppendFormat("<label class=\"radio inline\" checked="false" for=\"{0}\">{1} {2}</label>", ID, Radio, HttpUtility.HtmlEncode(Item.Text)); 
       } 
      } 
      return MvcHtmlString.Create(SB.ToString()); 
     } 
+0

Cảm ơn nhưng damn nó đã không làm việc: (! Lạ! – Baconbeastnz

+1

Damn! Leme nghĩ về cách tiếp cận khác –

+1

@Baconbeastnz, điều duy nhất tôi có thể nghĩ là JS. Nhưng ow cảm thấy sai –

1

Thật không may, một nút radio phải luôn được kiểm tra. Đó là phần không may về các nút radio; tuy nhiên, bạn luôn có thể thêm nút radio ẩn vào biểu mẫu của mình và đặt thuộc tính đã chọn thành true; Có mã nội bộ của bạn chấp nhận một null hoặc bất cứ điều gì bạn mong đợi nếu không có gì được chọn từ nó.

thử thiết lập tất cả các nút giá trị của radio để đánh dấu hoặc sai

foreach(button in ButtonGroup){ 
button.checked = false; 
} 
+0

một nút radio phải luôn luôn được kiểm tra? Điều đó không thể chính xác, chắc chắn? – Baconbeastnz

+0

Nút radio yêu cầu một nút là true vì chúng được sử dụng để buộc người dùng chọn một trong các lựa chọn. Nếu bạn đã sử dụng hộp kiểm và có mã JS đã vô hiệu hóa các hộp khác khi một hộp được chọn thì bạn có thể có tất cả chúng được đánh dấu là sai. Nếu bạn cần phải có một không được chọn thì đó có thể là một triển khai tốt hơn. – Robert

+0

Tôi đang nói về trạng thái ban đầu. Tôi chắc chắn bạn có thể bỏ chọn chúng một cách trực tiếp.Anyway – Baconbeastnz

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