2016-04-08 18 views
-1

Kullanıcı adlarını tutan bir dizi açılır listelem var. Her ddl aynı modelden üretilir (Aynı bilgileri tutarlar). Bununla birlikte, her kullanıcı sadece bu formda bir kez seçilmelidir. Hangi kullanıcıların seçildiğini kontrol etmenin ve açılır listelerde görünmesini durdurmanın bir yolu var ve değer bir dll'den kaldırılırsa tekrar yeniden görünecek.Diğer açılır listelerde seçilen öğelere göre açılır listeden öğeleri kaldırın

Görünüm

@using (Html.BeginForm("Submit", "Booking", FormMethod.Post)) 
{ 
    <div id="modalbox" class="modal"> 
     <div class="modal-dialog"> 
      <div class="modal-content"> 
       <div id="modal-header" class="modal-header"> 
        <h1>Register New Booking</h1> 
       </div> 
       <div class="modal-body"> 
        <table id="booking-model-table" class="table table-condensed table-striped table-bordered"> 
         <tr> 
          <td>Person1:</td> 
          <td> 
           @{ 
            @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP1" }) 
            @Html.HiddenFor(m => m.SelectedUserText) 
            @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" }) 
           } 
          </td> 
         </tr> 
         <tr> 
          <td>Person2:</td> 
          <td> 
           @{ 
            @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP2" }) 
            @Html.HiddenFor(m => m.SelectedUserText) 
            @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" }) 
           } 
          </td> 
         </tr> 
         <tr> 
          <td>Person3:</td> 
          <td> 
           @{ 
            @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP3" }) 
            @Html.HiddenFor(m => m.SelectedUserText) 
            @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" }) 
           } 
          </td> 
         </tr> 
         <tr> 
          <td>Person4:</td> 
          <td> 
           @{ 
            @Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control", @id = "idP4" }) 
            @Html.HiddenFor(m => m.SelectedUserText) 
            @Html.ValidationMessageFor(m => m.User, "", new { @class = "text-danger" }) 
           } 
          </td> 
         </tr> 
        </table> 
       </div> 
       <div class="modal-footer"> 

        @Html.AntiForgeryToken() 
        <button class="btn btn-default" data-dismiss="modal">Close</button> 
        <button class="btn btn-primary" type="submit" value="Submit">Ok</button> 

       </div> 
      </div> 
     </div> 
    </div> 
            } 

Modeli

/// <summary> 
/// User List 
/// </summary> 
[Display(Name = "Users")] 
public string User { get; set; } 
public IEnumerable<SelectListItem> UserList { get; set; } 
public string SelectedUserText { get; set; } 

bu mümkün olabilir mi? Bir onchange olayı içinde öğeyi kaldırmak için bazı javascript eklemeyi düşünüyordum, ancak her ddl aynı modelden çıktığında yanıtı sileceğini hayal ediyorum.

Güncelleme: Ben JavaScript kullanarak ve her açılır koltuk seçimini değer katarak, şu anda benim için çalışan olası bir çözüm buldu.

@Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { @class = "form-control seat-select", @id = "idP1", @onchange = "cleanUsers(this);" 

JavaScript dosyası:

function cleanUsers(ddl) { 
var val = ddl.options[ddl.selectedIndex].value; 
var vOldVal = $("#" + ddl.id).attr("data-selected"); 
       $("#" + ddl.id).attr("data-selected", val); 

//If a user is selected disable them 
if (val != 0) { $(".seat-select option[value='" + val + "']").attr("disabled", true); } 

//If the previous value has been defined, enable the user again 
if (vOldVal != undefined) { $(".seat-select option[value='" + vOldVal + "']").attr("disabled", false); } 

}

+0

JS'nizdeki 'ddl 'yerine ne kullandınız? –

+0

Üzgünüz, bunu tekrar söyleyebilir misiniz? Ne anlatmak istediğinden emin değilim? – Ben

+0

Javascript'inizde 'function cleanUsers (ddl)' dır .. 'ddl' olarak kullandınız mı yoksa bunun için birşeyler mi yerine koydunuz –

cevap

0

Ben yerel bir liste nesnesi List<MyType> selectedUsers = new List<MyType>(); oluşturabilir ve kullanıcılar listeden seçilir gibi, sen selectedUsers eklemek düşünüyorum. selectedUsers'u mevcut kullanıcılarla karşılaştırın ve bir eşleşme varsa, kullanıcıyı diğer listeden kaldırın. Bunu yapmak için pek çok yol var, ama önce aklıma gelen bu.

+0

Teşekkürler Ustaca, şimdi asıl soruda yayınladığım bir javascript çözümü bulmayı başardım. Bu, çözümün gerçek zamanlı olarak görünümünde çalışmasına çalışmamıza rağmen çalışabileceğine benziyor, bu nedenle bilgilerin sunucuya gönderilmesi gerekmiyordu. – Ben

0

Aynı model için birden fazla açılan listeye sahip olmanın belirli bir nedeni var mı? Aynı modelden yüklenen birden çok kullanıcı seçmeye çalıştığınızı kabul ediyorum. Bu durumda, çoklu özniteliğe sahip bir seçim listesi kullanmanız yeterlidir.


@Html.DropDownListFor(m => m.User, Model.UserList, "Select User", new { multiple = "", @class = "form-control", @id = "idP2" }) 

gerçekten birden açılır listeleri kullanmak zorunda ancak varsa - ve tüm bu başarmak istiyorum varsayıyorum form gönderildiğinde önce - o zaman JavaScript kullanmak gerekecek. JavaScript dizisindeki tüm kullanıcıların bir listesini bulundurun. Bir kullanıcı her seçildiğinde, diğer listeleri yeniden doldurun ve seçilen kullanıcıyı hariç tutun. Yeniden oluşturmadan önce diğer listelerde bir seçim yapılıp yapılmadığını kontrol edin, böylece seçimi silmezsiniz.

+0

Teşekkürler David, Javascript ve özniteliklerle birlikte bir çözüm getirmeyi başardım. İlginç olan çok sayıda seçili listenin farkında değildim. Ayrılmalarının nedeni, her kişiye belirli bir koltuk atanması gerektiğidir ve bunu yapmak için her dizenin FormCollection'a eklenmesi gerekmeden nasıl yapılacağı konusunda olumlu değildim. Ancak, dedi. Eminim ki, her biri zor kodlama yapmadan aynı aşağıya açılan listelerin bir kısmını oluşturmanın daha iyi bir yolu olduğundan eminim (belki de bir çeşit şekil). Daha yeni bir şey bulamadım/düşünmedim. – Ben

+0

Hala neden ayrı listelerde bulunmaları gerektiğini anlamıyorum. Belki de onun neyi başarmaya çalıştığını henüz anlamadığım için. Ancak, birden fazla özniteliğe sahip bir açılır liste kullanırsanız, denetleyicinize bir liste nesnesi olarak ulaşırlar. Daha sonra basitçe döngü yapabilir ve koltuk numaralarını atayabilirsiniz. Belirli sayıda kullanıcının seçilmesini istiyorsanız, bu sadece ön uç ve arka uçta uygulamak zorunda kalacağınız bir onaylamadır. –

+0

Karışıklık için özür dilerim. Bu formu kullanacak olan Yönetici, her bir koltukta hangi kullanıcının tam olarak olacağını kontrol etmek isteyecektir. Bu uygulamada, her bir açılan menü belirli bir koltuk ile ilgilidir. Örneğin. Bir koltuk Bertie'ye gider ve Koltuk 2 Bob'a gider. Denetleyicide döngü yapıyorsa, yönetici, söyleyebileceğim kadar kime sahip olduğunu kontrol edemez. – Ben