|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。</p>偶然候会碰到这类情形:在一个表单上必要多个按钮来完成分歧的功效,好比一个复杂的审批功效。
假如是用webform那不必要会商,但asp.netmvc中一个表单只能提交到一个Action处置,绝对对照贫苦点。
办法一:利用客户端剧本
好比我们在View中如许写:
以下为援用的内容:
<inputtype="submit"value="考核经由过程"/>
在点击提交按钮时,先改动Form的action属性,使表单提交到按钮响应的action处置。
但有的时分,大概Action1和2的逻辑十分相似,大概只是将某个字段的值置为1大概0,那末分隔到二个action中又显得有点过剩了。
办法二:在Action中判别经由过程哪一个按钮提交
在View中,我们不必任何客户端剧本处置,给每一个提交按钮加好name属性:
以下为援用的内容:
<inputtype="submit"value="考核经由过程"name="action"/>
<inputtype="submit"value="考核欠亨过"name="action"/>
<inputtype="submit"value="前往"name="action"/>
然后在把持器中判别:
以下为援用的内容:
[HttpPost]
publicActionResultIndex(stringaction/*别的参数*/)
{
if(action=="考核经由过程")
{
//
}
elseif(action=="考核欠亨过")
{
//
}
else
{
//
}
}
几年前写asp代码的时分常常用如许的办法…
View变得复杂的,Controller庞大了。
太依附说View,会存在一些成绩。倘使哪天客户说按钮上的笔墨改成“经由过程考核”,大概是做个多言语版的,那就贫苦了。
参考:http://www.ervinter.com/2009/09/25/asp-net-mvc-how-to-have-multiple-submit-button-in-form/
办法三:利用ActionSelector
关于ActionSelector的基础道理能够先看下这个POST利用ActionSelector把持Action的选择。
利用此办法,我们能够将把持器写成如许:
以下为援用的内容:
[HttpPost]
[MultiButton("action1")]
publicActionResultAction1()
{
//
returnView();
}
[HttpPost]
[MultiButton("action2")]
publicActionResultAction2()
{
//
returnView();
}
在View中:
以下为援用的内容:
<inputtype="submit"value="考核经由过程"name="action1"/>
<inputtype="submit"value="考核欠亨过"name="action2"/>
<inputtype="submit"value="前往"name="action3"/>
此时,Controller已不必依附于按钮的Value值。
MultiButtonAttribute的界说以下:
以下为援用的内容:
publicclassMultiButtonAttribute:ActionNameSelectorAttribute
{
publicstringName{get;set;}
publicMultiButtonAttribute(stringname)
{
this.Name=name;
}
publicoverrideboolIsValidName(ControllerContextcontrollerContext,
stringactionName,System.Reflection.MethodInfomethodInfo)
{
if(string.IsNullOrEmpty(this.Name))
{
returnfalse;
}
returncontrollerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name);
}
}
参考:http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx
办法4、改善
ThomasEyde就办法三的计划给出了个改善版:
Controller:
以下为援用的内容:
[HttpPost]
[MultiButton(Name="delete",Argument="id")]
publicActionResultDelete(stringid)
{
varresponse=System.Web.HttpContext.Current.Response;
response.Write("Deleteactionwasinvokedwith"+id);
returnView();
}
View:
以下为援用的内容:
<inputtype="submit"value="notimportant"name="delete"/>
<inputtype="submit"value="notimportant"name="delete:id"/>
MultiButtonAttribute界说:
以下为援用的内容:
[AttributeUsage(AttributeTargets.Method,AllowMultiple=false,Inherited=true)]
publicclassMultiButtonAttribute:ActionNameSelectorAttribute
{
publicstringName{get;set;}
publicstringArgument{get;set;}
publicoverrideboolIsValidName(ControllerContextcontrollerContext,stringactionName,MethodInfomethodInfo)
{
varkey=ButtonKeyFrom(controllerContext);
varkeyIsValid=IsValid(key);
if(keyIsValid)
{
UpdateValueProviderIn(controllerContext,ValueFrom(key));
}
returnkeyIsValid;
}
privatestringButtonKeyFrom(ControllerContextcontrollerContext)
{
varkeys=controllerContext.HttpContext.Request.Params.AllKeys;
returnkeys.FirstOrDefault(KeyStartsWithButtonName);
}
privatestaticboolIsValid(stringkey)
{
returnkey!=null;
}
privatestaticstringValueFrom(stringkey)
{
varparts=key.Split(":".ToCharArray());
returnparts.Length<2?null:parts[1];
}
privatevoidUpdateValueProviderIn(ControllerContextcontrollerContext,stringvalue)
{
if(string.IsNullOrEmpty(Argument))return;
controllerContext.Controller.ValueProvider[Argument]=newValueProviderResult(value,value,null);
}
privateboolKeyStartsWithButtonName(stringkey)
{
returnkey.StartsWith(Name,StringComparison.InvariantCultureIgnoreCase);
}
}
假如是在MVC2.0中的话,将UpdateValueProviderIn办法改成:
以下为援用的内容:
privatevoidUpdateValueProviderIn(ControllerContextcontrollerContext,stringvalue)
{
if(string.IsNullOrEmpty(Argument))
return;
controllerContext.RouteData.Values[this.Argument]=value;
}
原文地点:http://www.ckuyun.com/wuchang/archive/2010/01/29/1658916.html
我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了? |
|