2016-04-28 3 views
3

У меня есть контроллер, который имеет действие Create. Его цель - получить имя и данные из формы файла и IndexViewModel вернуть IEnumerable<File> файлов.Как отправить данные в ASP.NET-контроллер с Angular2

public class HomeController : Controller 
{ 
    static List<Models.File> files = new List<Models.File>(); 

    public HomeController() { } 

    [HttpGet] 
    public IActionResult Index() => View(new IndexViewModel { Files = files }); 

    [HttpGet] 
    public IActionResult Create() => View(); 

    [HttpPost] 
    public IActionResult Create(IFormFile file) 
    { 
     var filename = 
      ContentDispositionHeaderValue.Parse(file.ContentDisposition) 
             .FileName; 

     using (var reader = new StreamReader(file.OpenReadStream())) 
     { 
      var content = reader.ReadToEnd(); 
      files.Add(new Models.File { Name = filename, Data = content }); 
     } 

     return RedirectToAction(nameof(Index)); 
    } 
} 

Когда я использую форму в статическом HTML, это хорошо, сервер получает данные. Но когда я использую ту же форму в шаблоне Angular2, это не так.

import {Component} from 'angular2/core'; 
import {File} from './file'; 


@Component({ 
    selector: 'listfile', 
    template: ` 
<form method="post" asp-action="Index" asp-controller="Api/File" enctype="multipart/form-data"> 
    <input type="file" name="files" #newFile (keyup.enter)="addFile(newFile.value)" 
    (blur)="addFile(newFile.value); newFile.value='' "> 
    <input type="submit" value="Upload" /> 
</form> 
    <table class="table"> 
     <th>id</th><th>name</th> 
     <tr *ngFor="#file of files"> 
      <td>{{file.id}}</td> 
      <td>{{file.name}}</td> 
     </tr> 
</table> 
    ` 
}) 
export class ListFileComponent { 
    files = [ 
     new File(1, 'file1'), 
     new File(2, 'file2') 
    ]; 
    addFile(newFile: string) { 
     if (newFile) { 
      this.files.push(new File(this.files.length + 1, newFile.split(/(\\|\/)/g).pop())) 
     } 
    } 
    falert(value) { 
     alert(value); 
    } 
} 

ответ

4

У вас есть неправильное представление о Angular2 шаблонам и MVC предварительной обработки. Here is a post это может убрать это. У вас есть ASP.NET тег-помощники, которые не будут отображаться на сервере и будут отправляться клиенту как есть.

Вы используете form post which passes form data, вместо этого вы должны использовать Web API сHttp службы Angular2 в.

У вас есть много вариантов, но два из них являются наиболее практичными в данный момент:

  1. Вы можете использовать возможности MVC для его предварительной обработки и имеет частичный вид возвращает форма. В компоненте использовать templateUrl вместо template и указывают на /controller/action что бы предварительно обработать в тег хелперы и вернуть HTML по своему желанию (это будет потом служить Angular2 шаблона.
  2. Вы можете начать используя Angular2 как истинный SPA и использовать только MVC для одной страницы ... /home/index. Затем вы используете templateUrl, чтобы указать на местные файлы .html, которые служат в качестве шаблона. И постройте API, который будет поддерживать все необходимые вам взаимодействия.

Надеюсь, это прояснит ситуацию!


Если вы собираетесь использовать встроенный или статический .html, вам нужно будет удалить вспомогательные теги тегов ASP.NET.

@Component({ 
    selector: 'listfile', 
    template: ` 
<form (submit)="" > 
    <input type="file" name="files" #newFile (keyup.enter)="addFile(newFile.value)" 
    (blur)="addFile(newFile.value); newFile.value='' "> 
    <input type="submit" value="Upload" /> 
</form> 
    <table class="table"> 
     <th>id</th><th>name</th> 
     <tr *ngFor="#file of files"> 
      <td>{{file.id}}</td> 
      <td>{{file.name}}</td> 
     </tr> 
</table> 
    ` 
}) 
export class ListFileComponent { 
    // ... 
    constructor(private http: Http) { } 
    onSubmit() { 
     const body = JSON.stringify({ this.files }); 
     this.http 
      .post('api/file/create', 
       body, 
       { headers: new Headers({ "Content-Type": "application/json" }) }) 
      .map(response => response.json()) 
      .subscribe(json => { /* handle it */ }); 
    } 
} 

Тогда вам нужно будет изменить свою подпись API, чтобы более точно принять данные.

+0

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

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

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