我想使用自定义动作过滤器来操作一个动作的参数。
用户输入:表单中的2个名称;
行动:实际上需要带2个ids;
动作过滤器(onExecuting,将验证输入名称,如果有效,将它们转换为2个ID并替换为routedata)
因为我不想将验证逻辑放在Action Controller中。
这是代码的一部分:
路由信息
routes.MapRoute( “默认”,//路线名称 “{controller} / {action}”,//带参数的网址 new {controller =“Home”,action =“Index”} //参数默认值 );
routes.MapRoute( “RelationshipResults”,//路由名称 “Relationship / {initPersonID} / {targetPersonID}”,//带参数的URL new {controller =“Relationship”,action =“Results”});
提交表单(创建2个输入框并通过jquery提交)
<%using(Html.BeginForm(“Results”,“Relationship”,FormMethod.Post,new {id =“formSearch”}))
{%GT;
...
<td align="left"><%: MvcWeibookWeb.Properties.Resource.Home_InitPersonName%></td>
<td align="right"> <%= Html.TextBox("initPersonID")%></td>
<td rowspan="3" valign="top">
<div id="sinaIntro">
<%: MvcWeibookWeb.Properties.Resource.Home_SinaIntro %>
<br />
<%: MvcWeibookWeb.Properties.Resource.Genearl_PromotionSina %>
</div>
</td>
</tr>
<tr>
<td align="left" width="90px"><%: MvcWeibookWeb.Properties.Resource.Home_TargetPersonName%></td>
<td align="right"><%= Html.TextBox("targetPersonID")%></td>
</tr>
<tr>
<td colspan="2" align="right">
<a href="#" class="btn-HomeSearch" onclick="$('#formSearch').submit();"><%: MvcWeibookWeb.Properties.Resource.Home_Search%></a>
</td>
动作过滤器
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Sina.Searcher searcher = new Sina.Searcher(Sina.Processor.UserNetwork);
String initPersonName, targetPersonName;
// form submit names, we need to process them and convert them to IDs before it enters the real controller.
initPersonName = filterContext.RouteData.Values["initPersonID"] as String;
targetPersonName = filterContext.RouteData.Values["targetPersonID"] as String;
// do sth to convert it to ids and replace
动作/控制器
[ValidationActionFilter] [的HandleError] 公共ActionResult结果(Int64 initPersonID,Int64 targetPersonID) {...
我的问题是:在actionFilter中,它永远不会获得2个参数“initPersonID”和“targetPersonID”,RouteData.Values不包含这2个键......
:(
答案 0 :(得分:0)
问题在于,由于您的路线没有initPersonName
和targetPersonName
的任何值,因此它们永远不会在您的路线数据中结束。尝试(尽管看起来有点奇怪):
initPersonName = filterContext.RouteData.Values["initPersonID"] as String;
targetPersonName = filterContext.RouteData.Values["targetPersonID"] as String;
由于“... ID”会显示路线中调用的值,这就是您必须在路线数据中查找的内容。你实际上没有在网址中包含ID的事实是另一回事......