Я знаю, что есть несколько подобных вопросов, как это уже, но никто из них не помог решить мою проблему.Вызов функции просмотра нокаута из jquery
Я пытаюсь загрузить файл с помощью сообщения ajax и вернуть json, содержащий описание файла, которое затем передается в функцию viewmodel с нокаутом, которая находится внутри моего .js-файла.
я могу загрузить файлы с помощью Ajax пост:
$('.upload-button').click(function() {
var formData = new FormData();
var file = document.getElementById("fileupload").files[0];
formData.append("FileUpload", file);
var action = "/QuestionWizard/Upload";
$.ajax({
type: "POST",
url: action,
data: formData,
contentType: false,
processData: false,
success: function (result) {
//call viewmodel function here and pass result
}
});
});
это моя ViewModel функция:
var ViewModel = function (d, m) {
var self = this;
var formData = null;
self.Model = ko.mapping.fromJS(d, m);
self.AddDoc = function (data) {
self.Model.CurrentStep().Files.push({ Name: data.Name, Extension: data.Extension, ContentType: data.ContentType, Size: data.Size, Content: data.Content, FilePath: data.FilePath, Folder: data.Folder });
}
}
Загрузить Действие:
[HttpPost]
public JsonResult Upload() {
FileUploadModel upload = new FileUploadModel();
try {
if (Request.Files != null) {
HttpPostedFileBase file = Request.Files[0];
upload.Size = settings.ConvertBytesToMegabytes(file.ContentLength);
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream)) {
upload.Content = binaryReader.ReadBytes(Request.Files[0].ContentLength);
}
upload.Name = Path.GetFileName(Request.Files[0].FileName);
upload.ContentType = Request.Files[0].ContentType;
upload.Extension = Path.GetExtension(Request.Files[0].FileName);
upload.Folder = User.Question + "-" + User.Token;
Transmit.write(ref upload);
}
} catch (Exception) {
return Json(null);
}
return Json(upload);
}
Загрузить Кнопка в виде:
<input type="file" name="fileupload" id="fileupload" data-bind="event:{ change: Upload.bind($data, $element.files[0]) }" />
Может кто-нибудь, пожалуйста, помогите мне выяснить, как вызвать функцию viewmodel и передать полученный json или лучший способ сделать это.
Спасибо.
'$ ('. Upload-button')' внутри контроллера не то, что я думаю о лучших методах ... лучше создать функцию на VM и «привязка данных» к событию клика кнопки, нет? – Will
Совсем нет. Это использует поддержку Knockout для ненавязчивой обработки событий. См. Http://knockoutjs.com/documentation/unobtrusive-event-handling.html. –
Хорошо, они его поддерживают, конечно. Но смешивание и сопоставление ... кажется немного запахом для меня. Во всяком случае, спасибо. – Will