1

У меня возникают проблемы с данными, представленными в действие моего контроллера с помощью модели нокаута. Каждое поле строки содержит дополнительные двойные кавычки, что является проблемой.Форма, представленная в действие MVC через нокаут, содержит дополнительные двойные кавычки

Хотя я могу десериализовать данные вручную, кажется, что эта проблема не должна возникать вообще при использовании MVC3. Имейте в виду, что мне нужно сделать форму, представляющую не пост ajax.

Html:

код
@inherits System.Web.Mvc.WebViewPage<FbWizardCreateTabModel> 

@using (Html.BeginForm("InstallApplication", "FbWizard", FormMethod.Post, new { id = "createtab", @data_bind = "submit:onSubmit" })) 
{ 
    <p>Page Id: <span data-bind="text: PageId"></span></p> 
    <p>Page Name: <span data-bind="text: PageName"></span></p> 
    <p>Tab Name: @Html.TextBoxFor(m => m.TabName, new { data_bind = "value: TabName" })</p> 
} 

<button class="btn btn-primary next">Submit</button> 

Сценарий:

действие
<script type="text/javascript"> 

     var initialData = @Html.Raw(Model.JsonData); 
     var viewModel = ko.mapping.fromJS(initialData); 

     viewModel.onSubmit = function() { 

      var action = $('#createtab').attr('action'); 

      ko.utils.postJson(action, this); 

      return false; 
     }; 

     ko.applyBindings(viewModel); 

    </script> 

Контроллер:

[HttpPost] 
public ActionResult InstallApplication(FbWizardCreateTabModel model) 
{ 
    // The model is mangled at this point, see image below 

    return View(); 
} 

Содержание модели после пост:

enter image description here

Сырье после данных:

POST http://mysite.localhost:7785/Admin/FbWizard/InstallApplication HTTP/1.1 
Host: mysite.localhost:7785 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Referer: http://mysite.localhost:7785/Admin/FbWizard/CreateTab 
Cookie: fbsr_.... 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 333 

PageId=%22231271443653720%22&PageName=%22Car5%22&TabName=%22Auctions2%22&JsonData=null&__ko_mapping__=%7B%22include%22%3A%5B%22_destroy%22%5D%2C%22ignore%22%3A%5B%5D%2C%22copy%22%3A%5B%5D%2C%22mappedProperties 

Что я делаю неправильно?

+0

Я просто смотрю на исходный код postJson, он, кажется, делает все входы, но когда он помещает значение, он вызывает ko.utils.stringifyJson, который, кажется, ставит кавычки вокруг вещей. Что, я думаю, ошибочно в этом случае? так что это может быть ошибка –

ответ

1

я мог бы быть WAY покинуть базу здесь ..... но ВОЗМОЖНО это ошибка .... Ниже приведен исходный код из нокаута с незначительным изменением

postJsonNoQuotes = function (urlOrForm, data, options) { 
     options = options || {}; 
     var params = options['params'] || {}; 
     var includeFields = options['includeFields'] || this.fieldsIncludedWithJsonPost; 
     var url = urlOrForm; 

     // If we were given a form, use its 'action' URL and pick out any requested field values 
     if((typeof urlOrForm == 'object') && (ko.utils.tagNameLower(urlOrForm) === "form")) { 
      var originalForm = urlOrForm; 
      url = originalForm.action; 
      for (var i = includeFields.length - 1; i >= 0; i--) { 
       var fields = ko.utils.getFormFields(originalForm, includeFields[i]); 
       for (var j = fields.length - 1; j >= 0; j--) 
        params[fields[j].name] = fields[j].value; 
      } 
     } 

     data = ko.utils.unwrapObservable(data); 
     var form = document.createElement("form"); 
     form.style.display = "none"; 
     form.action = url; 
     form.method = "post"; 
     for (var key in data) { 
      var input = document.createElement("input"); 
      input.name = key; 
      // I think this is the offending line.... 
      // input.value = ko.utils.stringifyJson(ko.utils.unwrapObservable(data[key])); 
      input.value = ko.utils.unwrapObservable(data[key]); 
      form.appendChild(input); 
     } 
     for (var key in params) { 
      var input = document.createElement("input"); 
      input.name = key; 
      input.value = params[key]; 
      form.appendChild(input); 
     } 
     document.body.appendChild(form); 
     options['submitter'] ? options['submitter'](form) : form.submit(); 
     setTimeout(function() { form.parentNode.removeChild(form); }, 0); 
    } 
} 
+0

Эта строка выдает ошибку: input.value = ko.utils.unwrapObservable (data [key]). toString() ;, error: Ошибка: не удалось получить значение свойства 'toString': объект имеет значение null или undefined – rboarman

+0

может просто просто удалить toString вообще –

+0

Я просто летаю на месте штанов здесь, так как у меня нет кода для игры. –

0

ключ находится в имени функции, postJson. Он не предназначен для того, чтобы делать то, что вы пытаетесь сделать с ним, он принимает любые свойства объекта, который вы ему предоставляете, и публикует свои значения как JSON. Например, вы могли бы изменить свой пост к этому:

ko.utils.postJson(action, { json: this }); 

И ваши действия к этому:

[HttpPost] 
public ActionResult InstallApplication(string json) 
{ 
    JavascriptSerializer ser = new JavascriptSerializer(); 
    FbWizardCreateTabModel model = ser.Deserialize<FbWizardCreateTabModel>(json); 

    return View(); 
} 

Если вы хотите использовать функцию, как говорит Кейт, я хотел бы оставить JSON из названия, потому что вы, похоже, не хотите публиковать JSON, может быть, назовите его postAsFormData

+0

MVC3 обрабатывает Json bind только отлично. Ручное десериализация не требуется и не рекомендуется. – rboarman

+0

Это не то, что происходит, postJson публикует json как строковые значения, точно так же, как если бы вы набрали текст, который оказался json в текстовое поле. –

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

  • Нет связанных вопросов^_^