【问题标题】:Select value from view to controller从视图中选择值到控制器
【发布时间】:2018-12-12 19:43:12
【问题描述】:

我正在尝试将下拉列表中的选定值从我的视图传递到我的控制器,以便稍后进行查询。

这是我的视图与选择对象:

 <Select class="selectsector" id="ColumnType" name="ColumnType">
    <option value=""> Select something </option>
    <option value="">  option 1 </option>
    <option value="">  option 2 </option>
 </select>

然后根据文档和很多答案/示例,我试图从这一行的选择中获取值:

 {{ route('trend', ['ColumnType' => $ColumnType->ColumnType])}} 

我的路线:

 Route::get('kitysoftware/ColumnType/{ColumnType}', [
 "uses" => 'SubSectorsBPIsDataController@TrendFilter',
 "as" => 'trend'
  ]);

我的控制器:

  public function TrendFilter($ColumnType)
  {
  $SelectedTrend = DB::table('SubSectorsBPIsData')->select('SectorID', 'ColumnType')->where('ColumnType', $ColumnType)->get();
    echo $selectedTrend; //or whatever else i want to do        
}

错误 我不断收到:未定义的变量:ColumnType(查看:... 我试图更改该行中的几个变量名称: {{ route('trend', ['ColumnType' => $ColumnType->ColumnType])}} *它来自那个未定义的变量: $ColumnType ? 我没有重新加载页面,因为我想收集几个下拉列表值然后进行查询。 不确定我是否得到了正确的方法,也许有更好的方法让它发挥作用。 也许是 JavaScript?
提前致谢。

【问题讨论】:

    标签: php laravel laravel-5 model-view-controller


    【解决方案1】:

    澄清: 您在视图中编写的代码是 HTML。如果您使用{{...}},则大括号中的代码首先在 php 中进行评估。所有这些都发生在您的服务器上。发生这种情况时,$ColumnType-Variable 不存在(以后也不存在)。当您的服务器试图知道变量的值是什么时,用户甚至还没有看到您的网站。

    要将数据从用户发送回您的控制器,我建议使用表单:

    <form action="{{route('trend')}}" method="POST">
        <select class="selectsector" id="ColumnType" name="ColumnType">
            <option value=""> Select something </option>
            <option value="option1">option1</option>
            <option value="option2">option2</option>
        </select>
        <input type="submit"></input>
    </form>

    提交表单后,浏览器会自动向您的控制器发送带有参数ColumnType 的请求。如果您想使用 POST,请将您的路由定义更改为 Route::post。您可以像这样访问参数的值:

    public function TrendFilter(Request $request)
    {
        $selectedOption = $request->input('ColumnType');
    }
    

    编辑 解决您的 cmets:

    如果您采用 POST 方法,则不需要 URL 中的 {ColumnType}-subpath。所选选项通过请求传递,并且在 URL 中不可见。

    如果您想要 URL 中的参数(如果您想通过共享 URL 来共享站点,这可能很有用),然后使用 GET。然后,您的浏览器会将所选选项作为参数附加到 URL。像这样:

    ?options=option1
    

    两种方式,您都可以像上面描述的那样访问控制器中的选定选项。

    您收到“找不到路由”错误,因为route( name )-函数将路由名称作为参数。在您的情况下,这将是 trend,由您的路由定义中的“as”设置。

    另外请注意,您可能需要控制器中的第二个处理程序来接受表单反馈并执行查询。然后,您可以使用更新的值 (data) 重定向到上一页(同一视图)并保留选定的选项 (withInput())。

    public function acceptForm(Request $request){
        $selectedOption = $request->input('ColumnType');
        data = doQuery($selectedOption)...
        return redirect()->back()->with(data)->withInput();
    } 
    

    【讨论】:

    • 谢谢,这真的很有帮助。使用 POST 方法是否意味着用户必须提交表单?因为我想要的只是获取几个下拉值然后提交表单,但我想像你说的那样获取值是有意义的。
    • POST 和 GET 是请求方法,通常 POST 用于发送填写好的表单。它没有说明谁提交表单。您可以在一个表单中放置多个下拉菜单,或使用&lt;select multiple&gt;。我不完全明白,你想要实现什么。也许你可以在你的问题中更详细地描述它?
    • 再次嗨@streamfighter 在阅读/测试更多之后,我提出了一个问题,提交表单时我在路线上放了什么?我的意思是,我想捕获
    • contine... 我的表单 &lt;form action="{{route('kitysoftware/ColumnType/{ColumnType}')}}" method="POST"&gt; 错误 我不断收到未定义的路线。尝试了几条路线,我只能设法得到一个 404 错误:(你能澄清或指出我可以获得更多信息的任何视频/帖子吗?再次感谢
    • 即使我将路由更改为新的 view.blade.php 文件,我得到的只是一个空白页面,令人沮丧的是没有将变量值传递给控制器​​:(
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多