Wie können Sie kendo-fileselect verwenden, um von einer eckigen App in eine C#-Web-API hochzuladen?

333Matt

Wir implementieren Kendo für Angular in unserem Projekt. Wir haben ein bestehendes Projekt, das Kendo-Upload verwendet, das sofort einen Aufruf an den Server auslöst, aber das kann ich für diese Seite nicht tun.

Bildschirmfoto

Die Seite ist für einen Mitarbeiter zum Hochladen eines Lebenslaufs. Sie haben möglicherweise einen vorhandenen Lebenslauf und müssen zuerst gefragt werden, ob sie diesen ersetzen möchten, und sie erhalten ein Feld zur Eingabe einer Beschreibung. Daher denke ich, dass ich kendo-fileselect verwenden und möglicherweise einen Dialog auslösen muss (sind Sie sicher, dass Sie ersetzen möchten?) und die Beschreibung und die Mitarbeiter-ID auf Knopfdruck mitsenden. Also habe ich ein Objekt erstellt, um diese Daten zu tragen.

Sie können sehen, dass das Objekt aufgefüllt wird, wenn es die API aufruft:

Debugging-Lebenslauf

Aber wenn ich versuche, die API-Methode aufzurufen, erhalte ich eine Fehlermeldung:

Failed to load resource: the server responded with a status of 400 (Bad Request) [http://localhost:6300/api/employee/resume]

Fehlerdetails

Der entsprechende Code ist unten.

Serverseitig:

public class EmployeeResume
{
    public int ResumeId { get; set; }
    public int EmployeeId { get; set; }
    public DateTime CreatedDate { get; set; }
    public string Description { get; set; }
    public byte[] FileContent { get; set; }
    public string FileName { get; set; }
}

[HttpPut("resume")]
    public async Task<IActionResult> UploadResume([FromBody] EmployeeResume resume)
    {            
        if (resume == null)
        {
            return BadRequest();
        }


        return Ok();
    }

Client-Seite:

// Model
export interface EmployeeResume {
    createdDate?: string;
    description?: string;
    employeeId: string;
    fileContent: any;
    fileName: string;    
    resumeId?: string;
}

// CHILD component
// -----------------------------------------------------------

// Kendo FileSelect in template
<kendo-fileselect
    formControlName="uploadFile"
    [restrictions]="uploadRestrictions"
    [multiple]="false"
    (select)="selectEventHandler($event)">
</kendo-fileselect>

// Sets a component property to the selected file
selectEventHandler(e: SelectEvent): void {
    this.uploadfile = e.files[0];
}

// When upload button is clicked, create the
// resume object and emit an event to parent
upload(): void {

    if (this.uploadfile.validationErrors) return;

    const thisComponent = this;
    const reader = new FileReader();

    reader.onload = function (ev) {
      const request = {
        description: thisComponent.f.description.value,
        employeeId: thisComponent.employeeId,
        fileContent: ev.target.result,
        fileName: thisComponent.uploadfile.name
      } as EmployeeResume;

      thisComponent.onUpload.emit(request);
    }

    reader.readAsDataURL(this.uploadfile.rawFile);    
}

// PARENT component
// -----------------------------------------------------------

// Template
<app-employee-resume
    [employeeId]="(employeeId$ | async)"
    (onUpload)="uploadResume($event)">
</app-employee-resume>

// Handler
uploadResume(resume: EmployeeResume) {    
    this.svc.upsertResume(resume)
}

// 'svc'
upsertResume(resume: EmployeeResume) {
    return this.http.put(`${this.apiUrl}/employee/resume`, resume);
}
333Matt

Sie können dafür das ts FormData und ein benutzerdefiniertes FileData-Objekt mit beliebigen zusätzlichen Eigenschaften verwenden, die Sie in der DB speichern möchten:

  onFileSelected(e: SelectEvent): void {
    this.uploadfile = e.files[0].rawFile;
  }

upload(): void {

const formData = new FormData();
const fileForSave = new FileData();

fileForSave.fileCategoryId = FileCategory.EmployeeResume;
fileForSave.description = this.f['description'].value;
fileForSave.employeeId = this.employeeId;

if (this.uploadfile) formData.append('file', this.uploadfile);
formData.append('fileForSave', JSON.stringify(fileForSave));

this.onUpload.emit(formData);
this.resetForm();
  }

  addFile(form: FormData): Observable<FileData> {
    return this.http.post<FileData>(`${this.apiUrl}/file/`, form);
  }

Dann sieht Ihre API-Methode etwa so aus:

    [HttpPost]
    public async Task<IActionResult> AddFile(
        IFormFile file,
        [ModelBinder(BinderType = typeof(JsonModelBinder))] Contracts.Entities.File fileForSave)
    {
        // Check any file validations if you want

        /* Save the IFormFile file to disk */

        /* Save entity fileForSave File object to the DB */

        return Ok(newFile);
    }

Und ich werde das sogar für dich einwerfen:

public class JsonModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        // Check the value sent in
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        if (valueProviderResult != ValueProviderResult.None)
        {
            bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

            // Attempt to convert the input value
            var valueAsString = valueProviderResult.FirstValue;
            var result = Newtonsoft.Json.JsonConvert.DeserializeObject(valueAsString, bindingContext.ModelType);
            if (result != null)
            {
                bindingContext.Result = ModelBindingResult.Success(result);
                return Task.CompletedTask;
            }
        }

        return Task.CompletedTask;
    }
}

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

NextJS - Können Sie eine Rückgabe von einer API in einer Bedingung verwenden?

Wie können Sie eine Schaltfläche verwenden, um Elemente auf einer Leinwand in Python zu verschieben?

Wie können Sie eine Foreach-Schleife verwenden, um Daten von Datentabellenknoten in treenode zu iterieren?

Wie können Sie die Java Stream-API verwenden, um eine Liste von Objekten basierend auf den im Objekt gespeicherten Informationen in eine verschachtelte Karte zu konvertieren?

Wie können Sie die Java Stream-API verwenden, um eine Liste von Objekten basierend auf den im Objekt gespeicherten Informationen in eine verschachtelte Karte zu konvertieren?

Der Versuch, eine Datei von einer UWP-App in die flask restful web api hochzuladen, ist fehlgeschlagen

Wie können Sie feststellen, ob Sie eine Anfrage von einer API oder eine Seite Scraping benötigen?

Wie können Sie Ergebnisse von einer API in PHP streamen?

Können Sie die Block-Kurzform von Ruby verwenden, um eine Methode wie den Array-Accessor aufzurufen?

Wie kann ich eine Gruppe von Web-Workern aus dem Haupt-Thread in einer eckigen App beenden?

Wie verwenden Sie eine signierte Richtlinie aus Google Cloud / Storage, um Daten hochzuladen?

Können wir die AWS IAM-Rolle verwenden, um eine Datei im Ruhezustand hochzuladen?

Wie oft können wir eine iOS-App in TestFlight hochladen, ohne den App Store hochzuladen?

Wie verwenden Sie eine Variable, um auf eines von mehreren Wörterbüchern zu verweisen, damit Sie dieses eine Wörterbuch bearbeiten können?

Verwenden Sie PUT, um eine Datei mit TIdHTTP hochzuladen

Verwenden Sie PuTTY, um Dateien in eine Batchdatei hochzuladen

Wie exportiere ich ein Objekt aus einer Datei, die eine Liste von Objekten enthält, und importiere dasselbe Objekt in eine andere Datei, um es verwenden zu können?

Wie können Sie eine bedingte Anweisung in einer schnellen Methode verwenden?

Wie können Sie eine Liste aus einer Zukunft ordnungsgemäß zurückgeben, um sie in einem ListView.Builder in Flutter zu verwenden?

Wie kann ich eine Debugging-Version einer App auf einem Gerät erneut ausführen, ohne sie erneut von Android Studio hochzuladen?

Können Sie Web3.js mit Webpacker direkt in einer Rails 6-App verwenden?

Erstellen Sie eine C-Header-Datei, um sie in C ++ verwenden zu können

Wie können Sie mehrere Verzeichnisse für statische Dateien in einer Aspnet Core-App verwenden?

Wie können Sie einen WebSocket-Client in einer Flutter-App verwenden?

Python Tkinter - Wie können Sie einen Wert von einer Funktion zur anderen verwenden?

Wie können Sie von innerhalb einer Unterklasse in einer anderen Datei auf eine Superklasse zugreifen?

Wie können Sie eine mandantenfähige Rails-App einrichten, ohne Subdomains zu verwenden?

Wie können Sie das Schlüsselwort 'this' in einer Funktionssignatur verwenden, um einen Standardparameter festzulegen?

Können Sie den nativen Dateneditor von R verwenden, um eine CSV in Shiny zu bearbeiten?

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  3. 3

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  4. 4

    Eclipse Oxygen - Projekte verschwinden

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Wie kann ich den Kaskadenmodus global einstellen?

  7. 7

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  8. 8

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  9. 9

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  10. 10

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  11. 11

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  12. 12

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  13. 13

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  14. 14

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  15. 15

    Wie wählt man Unterschiede mit drei Tabellen aus?

  16. 16

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

  17. 17

    Wie kann ich meine Tabelle abfragen, um sie in mySQL nach 2 Feldern zu gruppieren?

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  20. 20

    Modbus Python Schneider PM5300

  21. 21

    Wie kann eine gleichmäßige Lastverteilung in ElasticSearch mit Indizes mit unterschiedlicher Anzahl von Shards erreicht werden?

heißlabel

Archiv