Как сделать, Ajax MVC ASP.NET формирует сообщение с multipart/form-data?

Вот ваша функция:

func createPDFFileAndReturnPath() -> String {

    let fileName = "pdffilename.pdf"
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    let documentsDirectory = paths[0] as! NSString
    let pathForPDF = documentsDirectory.stringByAppendingString("/" + fileName)

    UIGraphicsBeginPDFContextToFile(pathForPDF, CGRectZero, nil)

    UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 100, 400), nil)

    let font = UIFont(name: "Helvetica Bold", size: 14.0)

    let textRect = CGRectMake(5, 3, 125, 18)
    var paragraphStyle:NSMutableParagraphStyle = NSMutableParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
    paragraphStyle.alignment = NSTextAlignment.Left
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping

    let textColor = UIColor.blackColor()

    let textFontAttributes = [
        NSFontAttributeName: font!,
        NSForegroundColorAttributeName: textColor,
        NSParagraphStyleAttributeName: paragraphStyle
    ]

    let text:NSString = "Hello world"

    text.drawInRect(textRect, withAttributes: textFontAttributes)

    UIGraphicsEndPDFContext()

    return pathForPDF
}
24
задан dswatik 24 February 2009 в 13:22
поделиться

6 ответов

  1. можно использовать некоторые дополнительные загрузчики (например, jQuery, несколько регистрируют загрузчик ) (я предпочитаю этот путь, и я предпочитаю не использовать Ajax MS)
  2. Использование:

    AjaxHelper.BeginForm("Post", "Entries", new {id=ViewData.Model.MemberDetermination.DeterminationMemberID}, new AjaxOptions(){/*some options*/}, new {enctype="multipart/form-data"})
    

, Но во втором случае я не уверен, что он будет работать.

6
ответ дан matsjoyce 16 October 2019 в 07:38
поделиться
5
ответ дан Marc Gravell 16 October 2019 в 07:38
поделиться

Я действительно ответил на вопрос сам ...

<% using (Ajax.BeginForm("Post", "Entries", new { id = ViewData.Model.MemberDetermination.DeterminationMemberID }, new AjaxOptions { UpdateTargetId = "dc_goal_placeholder" }, new { enctype = "multipart/form-data" }))
2
ответ дан dswatik 16 October 2019 в 07:38
поделиться

Я смешал ответ Брэда Ларсона с Амирхосейном Мехрварзи, потому что в ответе Брэда не было никакого способа справиться с ответом, а Амирхосейн вызывал 2 постбэка. Я просто добавил ($ ('# formBacklink'). Valid ()), чтобы вызвать проверку модели перед отправкой.

window.addEventListener("submit", function (e) {
        if ($('#formBacklink').valid()) {
            var form = e.target;
            if (form.getAttribute("enctype") === "multipart/form-data") {
                if (form.dataset.ajax) {
                    e.preventDefault();
                    e.stopImmediatePropagation();

                    var dataString;
                    event.preventDefault();
                    var action = $("#formBacklink").attr("action");
                    if ($("#formBacklink").attr("enctype") == "multipart/form-data") {
                        //this only works in some browsers.
                        //purpose? to submit files over ajax. because screw iframes.
                        //also, we need to call .get(0) on the jQuery element to turn it into a regular DOM element so that FormData can use it.
                        dataString = new FormData($("#formBacklink").get(0));
                        contentType = false;
                        processData = false;
                    } else {
                        // regular form, do your own thing if you need it
                    }
                    $.ajax({
                        type: "POST",
                        url: action,
                        data: dataString,
                        dataType: "json", //change to your own, else read my note above on enabling the JsonValueProviderFactory in MVC
                        contentType: contentType,
                        processData: processData,
                        success: function (data) {
                            //BTW, data is one of the worst names you can make for a variable
                            //handleSuccessFunctionHERE(data);   
                        },
                        error: function (jqXHR, textStatus, errorThrown) {
                            //do your own thing       
                        }
                    });
                }
            }
        }
    }, true);
1
ответ дан Claudio 16 October 2019 в 07:38
поделиться

Ajax.BegineForm () работает с данными многоэлементных форм, и вот пример рабочего кода для того же:

Представление:

@using(Ajax.BeginForm("UploadFile","MyPOC",
        new AjaxOptions { 
            HttpMethod = "POST"
        }, 
        new 
        {
            enctype = "multipart/form-data"
        }))
    {
        <input type="file" name="files" id="fileUploaderControl" />
        <input type="submit" value="Upload" id="btnFileUpload" />
    }

Контроллер Метод действия:

public void UploadFile(IEnumerable<HttpPostedFileBase> files)
    {
        HttpPostedFileBase file = files.FirstOrDefault(); //Attach a debugger here and check whether you are getting your file on server side or null.
        if (file != null && file.ContentLength > 0)
        {
            //Do other validations before saving the file

            //Save File
            file.SaveAs(path);
        }
    }

PS Убедитесь, что атрибут «name» элемента управления загрузчиком файлов и имя параметра, переданного в метод действия UploadFile (), должны быть одинаковыми (то есть «файлы» в данном случае).

0
ответ дан Rachit Pandey 16 October 2019 в 07:38
поделиться

Вы можете использовать этот код вместо eval

  var body = "function(a){ " + form.dataset.ajaxSuccess + "(a) }";
  var wrap = s => "{ return " + body + " };"
  var func = new Function(wrap(body));
  func.call(null).call(null, returnedData);
0
ответ дан Abdullah Sheikh 16 October 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: