我使用的是Laravel 5.1。我尝试通过控制器以JSON格式获取一些数据,但它返回html而不是json。
create.blade.php
{!! Form::open(['url' => 'schedule']) !!}
@include('schedule.form',['submitButtonText'=>'Submit'])
{!! Form::close() !!}
edit.blade.php
{!! Form::model($schedule,['method'=>'PATCH','url' => 'schedule/'. $schedule->scheduleID ]) !!}
@include('schedule.form',['submitButtonText'=>'Update'])
{!! Form::close() !!}
schedule.form中的Ajax
$.post('../schedule/loadRoute',{routeID:routeID},function(r){
console.log(r);
$.each(JSON.parse(r), function(key, value){
coordinates.push(new google.maps.LatLng(value.lat,value.lon));
if(value.is_station==1){
addMarker(new google.maps.LatLng(value.lat,value.lon),value.name);
}
});
clearMap();
});
控制器中的loadRoute函数
public function loadRoute(Request $request){
$routeID=$request->get('routeID');
$station=Station::where('route_id',$routeID)->get()->toArray();
echo json_encode($station);
}
修改
routes.php文件
Route::group(
['middleware' => ['web']],
function () {
Route::auth();
Route::get('schedule/getScheduleByRouteID/{routeID}', 'ScheduleController@getScheduleByRouteID');
Route::resource('schedule', 'ScheduleController', ['except' => ['destroy', 'show']]);
Route::post('schedule/loadRoute','ScheduleController@loadRoute');
});
创建和编辑页面共享相同的schedule.form,但JSON数据仅在创建页面中成功返回,对于编辑页面,它返回html而不是JSON,我在控制台中收到此错误(Uncaught SyntaxError:Unexpected token <在位置0的JSON中)
两个页面都使用相同的表单,但为什么它来编辑页面时不起作用?
答案 0 :(得分:3)
我认为您之所以看到这一原因,原因之一是因为loadRoute
路线下方的resource
路线。
尝试将订单更改为:
Route::get('schedule/getScheduleByRouteID/{routeID}', 'ScheduleController@getScheduleByRouteID');
Route::post('schedule/loadRoute','ScheduleController@loadRoute');
Route::resource('schedule', 'ScheduleController', ['except' => ['destroy', 'show']]);
https://laravel.com/docs/5.2/controllers#restful-supplementing-resource-controllers
此外,您应该return
来自控制器而不是echo
:
public function loadRoute(Request $request)
{
return Station::where('route_id', $request->get('routeID'))->get();
}
在上面Laravel
会自动json_encode()
回复并添加相应的标题。
通过$.post
来电,我会将其更改为以下内容:
$.post('{{ url('schedule/loadRoute') }}', {routeID: routeID, _token: '{{ csrf_token() }}'}, function (r) {
console.log(r);
$.each(r, function (key, value) {
coordinates.push(new google.maps.LatLng(value.lat, value.lon));
if (value.is_station == 1) {
addMarker(new google.maps.LatLng(value.lat, value.lon), value.name);
}
});
clearMap();
}, 'json');
这是因为Laravel现在将使用正确的标头返回正确的json
响应,因此您不需要JSON.parse()
它。此外,您似乎没有提供csrf_token
,因此也已添加到数据对象中。
希望这有帮助!