2016-04-01 17 views
0

Seçili değeri göstermek için açılan listenin nasıl yapılacağı konusunda kafam karıştı.DropdownListFor seçilen değeri göstermiyor

Modeli:

public class SampleModel 
{   
    public string State { get; set; } 
} 

Denetleyici:

public ActionResult EditInformation() 
{ 
    ViewBag.State = new SelectList(db.States, "StateName", "StateName"); 

    string userEmail = User.Identity.GetUserName(); 

    Sample model = new SampleModel();  
    model.State = "Melbourne"; 

    return View(model); 
} 

Görünüm:

@Html.DropdownListFor(m => m.State, ViewBag.State as IEnumerable<SelectListItem>, "-- Select State --") 

liste gayet durumlarını gösteren, ancak otomatik olarak değer I seçmez atandı ("Melbourne"). SelectValue atamak için selectlist oluşturucu kullanmayı denedim, ancak çok fazla araştırma yaptıktan sonra, birisi, modele atanan değeri kullanacağınız için Html.DropdownListFor() kullanıyorsanız, selectlist constructor'ı kullanmak için gereksiz olduğunu yazdı.

DÜZENLEME:

public class State 
{ 
    [Key] 
    public int StateId { get; set; } 
    public string StateName { get; set; } 

} 

Yine değeri ve selectlistitem için metni olarak statename kullanmak istediğiniz netleştirmek için:

İşte benim db.State modelidir.

DÜZENLEME: Benim tam eylem yöntemi:

public ActionResult EditInformation() 
    { 
     //var states = ndb.States.Select(s => new SelectListItem { Text = s.StateName, Value = s.StateName , Selected = s.StateName == "Jawa Timur" }).ToList(); 

     ViewBag.State = new SelectList(ndb.States, "StateName", "StateName"); 
     ViewBag.City = new SelectList(ndb.Cities, "CityName", "CityName"); 
     string[] countries = { "Indonesia" }; 
     ViewBag.Country = new SelectList(countries); 

     string userEmail = User.Identity.GetUserName(); 
     try 
     { 
      UserInformation userInfo = ndb.UserInformations.Single(m => m.Email == userEmail); 
      UserAccountViewModel model = new UserAccountViewModel(); 

      model.Address = userInfo.Address; 
      model.Email = userEmail; 
      model.FirstName = userInfo.FirstName; 
      model.LastName = userInfo.LastName; 
      model.Phone = userInfo.Phone; 
      model.PostalCode = userInfo.PostalCode; 
      Debug.Print(userInfo.State); 
      model.State = userInfo.State; 
      model.City = userInfo.City; 
      model.Country = userInfo.Country; 


      return View(model); 
     }catch { } 
     return View(); 

    } 
+0

Sizin "db.States" neye benziyor? – SeM

+0

Neden bir "SampleModel" modeli yayınladınız ve ViewBag'inizi db.States 'den bir şeyle mi yüklediniz? Modelinizi 'States' için gönderin. 'Db.States '' ID' var mı? –

+0

@BviLLe_Kid, aslında modele daha çok var, sadece basitleştiriyorum, böylece siz daha iyi okuyabilirsiniz, gerisi sadece basit bir özelliktir ve beklendiği gibi çalışıyorlar. benim db.Stat'larımın bir kimliği var, ama ismi değer olarak kullanmayı tercih ediyorum. –

cevap

0

bu deneyin:

public class SampleModel 
{   
    public int Id { get; set; } 
    public string State { get; set; } 
} 

Denetleyici:

public ActionResult EditInformation() 
{ 
    //Select default value like this (of course if your db.States have an Id): 
    ViewBag.State = new SelectList(db.States, "Id", "StateName", 1 /*Default Value Id or Text*/); 
    . . . 
    return View(); 
} 

SelectList(IEnumerable, String, String, Object) - SelectList sınıfının yeni bir örneğini başlatır speci kullanarak liste, veri değeri alanı, veri metni alanı, ve seçili değer için.

Görünüm:

@Html.DropdownList("State", null, "-- Select State --") 

Yoksa yaptıkları gibi:

@Html.DropdownListFor(m => m.State, ViewBag.State as IEnumerable<SelectListItem>, "-- Select State --") 

GÜNCELLEME:

Öyle gibi jQuery kullanarak metin Seçilen alabilirsiniz

: ekle @Html.HiddenFor(x => x.State)

@Html.DropdownListFor(m => m.State, ViewBag.State as IEnumerable<SelectListItem>, "-- Select State --", new { id = "stateId" }) 
@Html.HiddenFor(x => x.State) 

JS:

$(function() { 
$("form").submit(function(){ 
    var selectedText= $("#stateId :selected").text(); 
    $("#State").val(selTypeText);   
    }); 
}); 

Mesaj: En EditInformation Görünümünde

[HttpPost] 
public void UploadDocument(State model) 
{ 
    if(ModelState.IsValid) 
    { 
     string state = model.State; 
    } 
} 
+0

Cevabınız için teşekkür ederim, ancak selectlistitem'in değerinin metinle aynı olmasını istiyorum. –

+0

Cevabımı güncelledim. – SeM

+0

Yardımın için minnettarım, ancak çalışmayı yapmaktan ziyade neyin neden olduğu konusunda daha fazla endişeliyim. –

1
public ActionResult EditInformation(int? id /*this will be passed from your route values in your view*/) 
{ 
    State myState = db.States.Find(id) 


    ViewBag.State = new SelectList(ndb.States, "StateId", "StateName", myState.StateId); 
}//I only added this because this is what the question pertains to. 

Eğer öyleyse, doğru bilgilerin alınması, böylece kullanıcının kimliği bağlamak için bir actionlink olması gerekir :

EditInformation Görünüm:

@foreach (var item in Model) 
{ 
    @Html.ActionLink("Edit Information", "EditInformation", /*Controller Name if this view is rendered from a different controller*/, new { id = item.id }) 
} 
+0

Bu ismi nasıl bir değer olarak istersem? –

+0

kimliği değil, bu tür bir çözümü zaten yanıtladı. – SeM

+0

@StewartJingga Yani bu çözümü denediniz ve 'Devlet' değil, 'Devlet' mi yaratıyorsunuz? –

0

OKAY, Uzun bir süredir araştırdıktan sonra, problem adlandırma kurallarında yatmaktadır. Görünüşe göre, Html.DropdownListFor(m => m.State) için ViewBag.State kullanamazsınız, bu nedenle, Html.DropdownListFor(m => m.State), verileri düzgün okumayan neden olur.

+0

bu yüzden @ Html.DropDownList ("State", null, --Select State--) –

+0

no'lu olarak değiştirdiniz, "ViewBag, State" öğesini "ViewBag.States" olarak değiştirmedim Devlet (çünkü modelin özelliği olduğu için) işe yarayacaktır. Eğer 'DropdownList 'kullanıyorsanız' ViewBag.State' kullanmalısınız, çünkü form için isim ve kimlik atayamazsınız. –

İlgili konular