2013-11-22 2 views
0

меня Палитрами на мой взгляд, что генерируется в JavaScript в этом форматеДобавить элемент в модели с формой имени

$input = $('<input name="colorPicker" value="'+ value +'" />'); 

Когда я сохранить, я получить всю модель, таким образом

[HttpPost] 
    public ActionResult AjoutHospitalisation(string ufsCode, DateTime dateDebutCalendrier, DateTime dateFinCalendrier, 
     GPL_Hospitalisation model, FormCollection collection) 

и внутри я установить модель с формой результата

  if (collection["colorPicker"] != null) 
      { 
       model.PastilleColor = collection["colorPicker"].ToString(); 
      } 

      Services.SvcHospitalisation.InsertOrUpdateHospitalisation(model, this.GetIntervenantId()); 

это работает хорошо, но это, кажется, не правильно. Я хочу, чтобы изменения имели автоматический процесс и не добавляли FormCollection. Я попробовал с CustomModelBinder, но мне нужно переписать все мои привязки к модели:/ Возможно ли «расширить» связующее для модели, чтобы добавить только некоторые поля, или я совершенно ошибочен в методе для достижения этой цели?

Заранее спасибо.

EDIT: Чтобы быть более точным, здесь полный частичный вид

<div class="color"> 
    <label>Pastille du patient</label> 
    <div class="picker"></div> 
    <input id="addColorPicker" class="add" type="button" value="Ajouter" /> 
</div> 

<script type="text/javascript"> 

    $.fn.colorPicker.defaults.colors = ['FF0000', 'FF8000', 'FFFF00', '40FF00', '0080FF', '000000']; 

    function addPicker(value) { 
     var $input; 
     if (value != null) 
      $input = $('<input name="PastilleColor" value="' + value + '" />'); 
     else 
      $input = $('<input name="PastilleColor" />'); 
     $(".picker").append($input); 
     $input.colorPicker({ showHexField: false }); 
    } 

    function removePicker(value) { 
     var input = value.format('input'); 
     var picker = value.format('picker'); 
     var palette = value.format('palette'); 
     $('#' + palette).hide(); 
     $('#' + picker).remove(); 
     $('#' + input).remove(); 
    } 

    $(function() { 
     if ("@(ViewBag.ColorPicker)" != "") 
     { 
      var str = "@(ViewBag.ColorPicker)".split(','); 
      $.each(str, function(index, value) { 
       addPicker(value); 
      }); 
     } 

     $("#addColorPicker").click(function() { return addPicker(); }); 
    }); 
</script> 

когда я отправить почту я отправляю с этим методом

$.ajax({ 
    url: EasilyRelativeUrl("Hospitalisation/AjoutHospitalisation"), 
    data: $('form').serialize(), 
    type: 'POST', 
    dataType: 'json' 
}).done(function (data) { ... } 

И с Fiddler я вижу хорошо «PastilleColor =% 23ff0000 & PastilleColor =% 23ffff00 ".

Если я не пройду, установив Model с FormCollection, у меня есть только первый PastilleColor в model.PastilleColor, а не эта строка «ff0000, ffff00». У меня есть этот формат для сериализации цвета в SQL, потому что я не знаю, сколько цветов требуется клиенту.

И это хорошо работает с

  if (collection["PastilleColor"] != null) 
      { 
       model.PastilleColor = collection["PastilleColor"].ToString(); 
      } 

поэтому мне нужно иметь «связующее», если у меня есть много полей для преобразования в 1 поле.

+0

Почему вы не можете изменить свое имя входа в PastilleColor? –

+0

Я попробовал. Но это атрибут name, а не id, он не работает. И атрибут идентификатора не может быть установлен, потому что у меня может быть один-много выбора цвета, и он сохраняется внутри одного поля, поскольку они поступают по запросу http. –

+0

Но на самом деле mvc model binder сравнивает атрибут имени с именем свойства модели. Поэтому, если вы измените имя ввода на: PastilleColor и поместите строку PastilleColor в параметры действия, она должна работать. –

ответ

0

Вы можете создать некоторый viewmodel класс и держать его простой

public ActionResult AjoutHospitalisation(MyViewModel model) 
{ 
var color=model.colorPicker; 
} 

В JavaScript Ajax

$input = $('<input name="colorPicker" value="'+ value +'" />'); 

var viewModel={}; 
viewModel.colorPicker='somevalue'; 
$.post(url,{data:JSON.Stringify(viewModel)}, function(result){ 

}); 

Если вы обычно после формы, пожалуйста, убедитесь, что у вас есть имя входного контроля, который соответствует свойство ViewModel. i.e colorPicker

Смежные вопросы