【发布时间】:2015-08-20 20:51:39
【问题描述】:
我有一张表格,其中显示了基本信息。它基本上是一个包含 n 行的两列表。
在第二列中,我显示了一个选择标签,用户应该在其中选择一个选项(在本例中是一个国家/地区)。所选选项的对应值将通过 ajax 调用在数据库中更新。
问题是我总是得到这个 500 内部服务器错误和 TokenMismatchException。我是否必须同时使用表单并使用{{ Form::token() }} ???
到目前为止我的代码仍然有这个问题如下:
HTML 表格(视图):
<div class="row">
<div class="col-lg-2">
</div>
<div class="col-lg-8">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Printed Media</th>
<th>Country</th>
</tr>
</thead>
<tbody>
<tr>
@foreach($medios as $medio)
<td>{{$medio->medio}}</td>
<td><select class="select2 req_place" placeholder="Elija" data-select-search="true"
id="medio-{{$medio->id}}" name="medio-{{$medio->id}}"
style="background-color: gray;">
<option selected disabled hidden value=''></option>
@foreach($paises AS $pais)
<option value="{{$pais->CLAVE}}">{{$pais->PAIS}}</option>
@endforeach
</select></td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="col-lg-2">
</div>
</div>
{{ Form::token() }}
我添加了 {{ Form::token() }}
Javascript 代码是:
$('select').change(function(e){
var id_c = jQuery(this).attr("id");
var result = id_c.split('-');
var id = result[1];
var value = $('#'+id_c).val();
var url_route = "{{URL::action('DifusionController@post_update_medio')}}";
var _token = $("input[name=_token]").val();
var datos = { id: id, value: value, _token: _token };
alert('A country was selected! id: '+id_c + '. Value: '+ value + '. id: '+id);
alert(url_route);
$.post(url_route, datos, function(data,status){
if(data=='success'){
alert('Success gotten');
}
});
});
还有我的路线在csrf组内:
/**** CSRF protection group ****/
Route::group(array('before'=>'csrf'),function(){
/*Update medios*/
Route::post('/pendientes/medios',array(
'as' => 'post-update-medio',
'uses' => 'DifusionController@post_update_medio'
));
/*Update reporteros*/
Route::post('/pendientes/reporteros',array(
'as' => 'post-update-reportero',
'uses' => 'DifusionController@post_update_reportero'
));
...
}
控制器内部:
public function post_update_medio()
{
if (Request::ajax())
{
$token=Request::header('X-CSRF-Token');// : Input::get('_token');
$id=Input::get('id');
$value=Input::get('value');
if(Input::has('id') && Input::has('value'))
{
echo 'Medio Posted ☺. ID: '.$id.'. Value: '.$value.' Token: '.$token.' . ';
/*Update database here*/
return 'success';
}
else
{
return 'error';
}
}
else
{
return 'No ajax request';
}
}
Chrome 检查器返回以下错误:
error: {type: "Illuminate\Session\TokenMismatchException", message: "",…}
file: "\MY\PATH\app\filters.php"
line: 179
message: ""
type: "Illuminate\Session\TokenMismatchException"
我必须添加带有令牌的表单吗? 我该如何解决这个问题?
但是现在它在编辑 jquery 代码和控制器后可以工作了。
参考资料:
【问题讨论】:
-
不,您不需要使用表单,但您确实需要将令牌与您的 AJAX 请求一起发送,作为参数或作为 HTTP 标头。对于第二种方法,您可以查看this nice article。
-
还有这个one :)
标签: php jquery ajax laravel laravel-4