Angular 4.2.4から.Net 4.6(MVC 4.0)コントローラにモデルといくつかの添付ファイルを送信しようとしています。 。Angels 4+ appからモデルとファイルのリストを.net MVCコントローラに投稿する方法
サンプルモデル:
//JS model
{
ID: number;
Name: string
NewAttachments: any
}
//.Net model
{
int ID {get;set;}
string Name {get;set;}
HttpPostedFileBase NewAttachments {get;set;}
}
の作業例:.NETはうまく形をとり、
saveHealthForm(form: HealthFormModel): Observable<HealthFormModel> {
let url = this.UPDATE_HEALTHFROM_URL;
return this.http.post(url, form, this.HTTP_OPTIONS)
.map(res => {
...
})
.catch((error, caught): Observable<HealthFormModel> => {
console.error(error);
this.onError.emit(error);
throw error;
});
}
[HttpPost]
public JsonResult UpdateHealthForm(HealthFormViewModel viewModel)
{
//view model is not null.
//view model contains no attachments.
//this works great without attachments
}
は、その後、私は添付ファイルを追加したいビューモデルに移入されます。まず、モデルに添付ファイルを追加するだけだと思っていました。しかし、FormDataを使用する必要があることがわかったので、それらを分離してフォームデータ引数として送信しました。
saveHealthForm(form: HealthFormModel, files:FileList): Observable<HealthFormModel> {
let formData: FormData = new FormData();
formData.append("viewModel", JSON.stringify(data));
if(files){
for (let i = 0; i < files.length; i++) {
formData.append(`files[]`, files[i], files[i].name);
}
}
let url = this.UPDATE_HEALTHFROM_URL;
return this.http.post(url, formData, this.HTTP_OPTIONS)
.map(res => {
...
})
.catch((error, caught): Observable<HealthFormModel> => {
console.error(error);
this.onError.emit(error);
throw error;
});
}
[HttpPost]
public JsonResult UpdateHealthForm(HealthFormViewModel viewModel, IEnumerable<HttpPostedFileBase> files)
{
//view model is null :(
//files are null :(
//it recieved the viewModel and the files, but i have to parse the viewModel out from json myself. :(
var myForm = Request.Form.Get("viewModel")
//im fine getting files this way, but the method param would be best.
var filewrapper = Request.Files.Get("files[]")
}
2つのコントローラメソッドを使用して、フォームデータにメソッド引数を設定するにはどうすればよいですか?
編集:モデルがnullでないように
これは、それを作ります。ただし、データは正しく入力されません。それがいるFormDataに渡されたとき
//formData.append("viewModel", JSON.stringify(data));
let formData: FormData = new FormData(data);
添付ファイルはdata
オブジェクトの上に位置しています。しかし、それらはモデルにないか、バックエンドでメソッド引数として渡されます。ここで
を完全な資料を参照してください。あなたが '.append()'文字列化されたオブジェクトはできません - あなたがする必要があります'.append()'あなたのオブジェクトの各プロパティ。正しいAjaxオプションを設定する必要があります。 [この回答](http://stackoverflow.com/questions/29293637/how-to-append-whole-set-of-model-to-formdata-and-obtain-it-in-mvc/29293681#29293681)を参照してください。 –
前半は正解ですが、JSのFormDataにフォームを間違って渡していましたが、Angularは対応フォームのソリューションでファイルをサポートしていませんでした。フロントエンドロジックは実際にフォームから分離しています。フォームにファイルを追加してテストします。 – kosmos