AFAIK, there is no in-built option for this, but it is relatively straight forward to implement using the core commands:
\def\floatbackrule{\blackrule[width=\textwidth,height=.8pt,color=red]}
\unprotect
\installfloatboxbuilder {topframed} \strc_floats_build_box_top_framed
\installfloatboxbuilder {bottomframed} \strc_floats_build_box_bottom_framed
\def\strc_floats_build_box_top_framed
{\floatbackrule
\strc_floats_build_box_top
\floatbackrule}
\def\strc_floats_build_box_bottom_framed
{\floatbackrule
\strc_floats_build_box_bottom
\floatbackrule}
\protect
Here is an example:
\setupcaption
[
location=topframed,
]
\setupexternalfigures[location={local,global,default}]
\starttext
\section{A figure with rules}
\input knuth
\startplacefigure[title={A dutch cow}, location=top]
\externalfigure[cow]
\stopplacefigure
\dorecurse{4}{\input knuth \endgraf}
\stoptext
which gives:

Addendum: This simple method fails with longer captions and does not work with the align
option. The reason is that an internal macro \strc_floats_prepare_page_caption
does some corrections with the location
parameter is top
or bottom
. These corrections don't take place when location
is set to topframed
. To fix this, we need to patch `\strc_floats_prepare_page_caption' as follows:
\def\strc_floats_prepare_page_caption
{\edef\p_strc_floats_caption_width {\floatcaptionparameter\c!width}%
\edef\p_strc_floats_caption_minwidth{\floatcaptionparameter\c!minwidth}%
\edef\p_strc_floats_caption_align {\floatcaptionparameter\c!align}%
\dostarttagged\t!floatcaption\empty
\doifcommonelse\floatcaptionlocation{\v!top,\v!bottom,topframed,bottomframed}
{\strc_floats_prepare_page_caption_top_bottom}
{\ifx\p_strc_floats_caption_width\v!fit
\strc_floats_prepare_side_auto_caption
\else\ifx\p_strc_floats_caption_width\v!max
\strc_floats_prepare_side_auto_caption
\else
\strc_floats_prepare_side_width_caption
\fi\fi}%
\dostoptagged}
Here is a complete example:
\setupexternalfigures[location={local,global,default}]
\def\floatbackrule{\blackrule[width=\textwidth,height=.8pt,color=red]}
\unprotect
\installfloatboxbuilder {topframed} \strc_floats_build_box_top_framed
\installfloatboxbuilder {bottomframed} \strc_floats_build_box_bottom_framed
\def\strc_floats_build_box_top_framed
{\floatbackrule
\strc_floats_build_box_top
\floatbackrule}
\def\strc_floats_build_box_bottom_framed
{\floatbackrule
\strc_floats_build_box_bottom
\floatbackrule}
\def\strc_floats_prepare_page_caption
{\edef\p_strc_floats_caption_width {\floatcaptionparameter\c!width}%
\edef\p_strc_floats_caption_minwidth{\floatcaptionparameter\c!minwidth}%
\edef\p_strc_floats_caption_align {\floatcaptionparameter\c!align}%
\dostarttagged\t!floatcaption\empty
\doifcommonelse\floatcaptionlocation{\v!top,\v!bottom,topframed,bottomframed}
{\strc_floats_prepare_page_caption_top_bottom}
{\ifx\p_strc_floats_caption_width\v!fit
\strc_floats_prepare_side_auto_caption
\else\ifx\p_strc_floats_caption_width\v!max
\strc_floats_prepare_side_auto_caption
\else
\strc_floats_prepare_side_width_caption
\fi\fi}%
\dostoptagged}
\protect
\setupcaption
[
location=topframed,
align=flushleft,
width=\textwidth,
]
\starttext
\section{A figure with rules}
\input knuth
\startplacefigure[title={\input zapf \relax}]
\externalfigure[cow]
\stopplacefigure
\dorecurse{4}{\input knuth \endgraf}
\stoptext
which gives

\startplacefigure\blackrule\externalfigure [kitten]\blackrule\stopplacefigure
. Then you'd just need to adjust captioning.