2015-06-10 1 views
1

Я разрабатываю веб-сайт с использованием ASP.NET MVC 5, с несколькими вариантами выбора с помощью Chosen.js. Мои действия заключается в следующем:Как установить опцию на Chosen.js через сервер?

[HttpGet] 
    public ActionResult Get() 
    {  
      var states = GetStates();  
      ViewBag.States = new SelectList(states.OrderBy(o => o.Id), "Value", "Name"); 
      return View();    
    } 

И в представлении:

@Html.ListBoxFor(m => m.States, 
     ViewBag.States as SelectList, new Dictionary<string, object> 
     { 
      {"multiple", "multiple"}, 
      {"class", "chosen-container-multi"}, 
      {"placeholder", "State"}, 
      {"id", "State"} 
     }); 

Он отлично работает, но я хотел бы Пре выбрать состояние пользователя перед нагрузкой на этой странице. Возможно, что-то вроде:

 ViewBag.States = new SelectList(states.OrderBy(o => o.Id), "Value", "Name","UserStateId"); 

но это не работает. Есть ли способ сделать это?

ответ

-1

я пошел к этому подходу:

Создано новую строку свойства на модели под названием UserState, то я получаю состояние пользователя и назначить его это свойство:

ViewBag.States= new SelectList(states.OrderBy(o => o.Id), "Value", "Name"); 
var model = new ModelDTO { UserState = states.Single(p => p.Id.Equals(stateId)).Value}; 
return View(model); 

Тогда на представлении я просто получить:

@Html.ListBoxFor(m => m.States, 
    ViewBag.States as SelectList, new Dictionary<string, object> 
    { 
     {"multiple", "multiple"}, 
     {"class", "chosen-container-multi"}, 
     {"placeholder", "State"}, 
     {"id", "State"} 
    }); 

<script> 
    $(function() { 
     $("#StatesListBox").chosen(); 
     $('#StatesListBox').val("@Model.UserState"); 
     $('#StatesListBox').trigger("chosen:updated"); 
    }); 
</script> 
+0

'ListBoxFor()' генерирует '', который позволяет вам выбирать несколько элементов в комментариях выше, в которых говорится, что вы хотите выбрать только один элемент (очень неясно, что вы действительно хотите сделать). И вы не можете назвать 'SelectList' таким же, как свойство, с которым вы связываетесь. Просто сделайте это '@ Html.DropDownListFor (m => m.UserState, ViewBag.States как SelectList, новый {@class =" ..."})' –

+0

И вам не нужно '$ ('# StatesListBox'). Val (" @ Model.UserState ");' - если вы привязываетесь к свойству 'UserState', и его значение соответствует одному из параметров, тогда он будет выбран при визуализации представления. –

1

Во-первых, вы не можете назвать свойство ViewBag так же, как и для вашей модели. Ваш список является обязательным для вашего свойства модели States, поэтому выбранные параметры будут основаны на значении States. Поскольку вы не возвращаете модель к своему виду, States имеет значение null, поэтому не выбрано никаких параметров.

Начните с использованием модели представления, представляет то, что вы хотите отобразить/редактировать в окне

public class MyViewModel 
{ 
    public int[] SelectedStates { get; set; } 
    public SelectList StatesList { get; set; } 
} 

Controller (обратите внимание, я предполагаю, что здесь, что State содержит свойство int Id (для связывания) и свойство string Name (значение дисплея), и что вы хотите предварительно выбрать состояния с Id=2 и Id=5)

[HttpGet] 
public ActionResult Get() 
{ 
    MyViewModel model = new MyViewModel();  
    var states = GetStates().OrderBy(o => o.Id); 
    model.StatesList = new SelectList(states, "Id", "Name"); 
    model.SelectedStates = new int[] { 2, 5 }; // set the value of the options you want to preselect 
    return View(model);    
} 

Посмотреть

@Html.ListBoxFor(m => m.SelectedStates, Model.StatesList, new { @class = "chosen-container-multi" }) 

Предполагая, что у вас есть 10 государств с Id между 1 и 10, тогда 2-й и 5-й варианты будут теперь выбраны, когда страница будет отображаться впервые. Когда вы отправляете свою форму, свойство SelectedStates будет содержать и массив значений, выбранных пользователем.

Side Примечание: ListBoxFor() уже добавляет атрибуты multiple="multiple" и id="SelectedStates"

+0

Спасибо за sugestion, но я пошел на другой подход, так как пользователь может иметь только одно состояние. Я отправил его на новый ответ. – gog

+0

Затем измените значение 'int [] SelectedStates' на' int SelectedState' и используйте '@ Html.DropdownListFor (m => m.SelectedState, Model.StatesList)' Другие мудрые все, что применяется –