deerchao的blog

Be and aware who you are.

Asp.net MVC, 谁吃了我的"id"参数值?

话说我有一个action:
public void SaveTask(Guid id, string title, bool? isPublic)

准备让它接收"CreateTask"和"EditTask"创建的表单:
    <form action="SaveTask" method="post">
        
<dl>
            
<dt>标题</dt>
            
<dd><input type="text"  value=""  size="20"  name="title"  id="title"  /></dd>
           
<dt>公开</dt>
         
<dd><input type="checkbox"  value="true"  name="isPublic"  />&nbsp;true</dd>
        
</dl>
      
<input type="hidden"  value="00000000-0000-0000-0000-000000000000"  name="id"  id="id"  />
        
<input type="submit"  value="创建任务"  name="submit"  id="submit"  />
    
</form>
但是每次提交表单,都会出现异常:
[FormatException: GUID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。]
   System.Guid..ctor(String g) 
+2284
   System.ComponentModel.GuidConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) 
+103
   System.ComponentModel.TypeConverter.ConvertFrom(Object value) 
+54
   System.Web.Mvc.Controller.ConvertParameterType(Object value, Type destinationType, String parameterName, String actionName) 
+161

[InvalidOperationException: Cannot convert parameter 
'id' in action 'SaveTask' with value '' to type 'System.Guid'.]
   System.Web.Mvc.Controller.ConvertParameterType(Object value, Type destinationType, String parameterName, String actionName) 
+301
   System.Web.Mvc.Controller.InvokeActionMethod(MethodInfo methodInfo, RouteValueDictionary values) 
+760

[InvalidOperationException: A value 
is required for parameter 'id' in action 'SaveTask'. The parameter either has no value or its value could not be converted. To make a parameter optional its type should either be a reference type or a Nullable type.]
   System.Web.Mvc.Controller.InvokeActionMethod(MethodInfo methodInfo, RouteValueDictionary values) 
+902
   System.Web.Mvc.Controller.InvokeAction(String actionName, RouteValueDictionary values) 
+263
   System.Web.Mvc.Controller.Execute(ControllerContext controllerContext) 
+161
   System.Web.Mvc.Controller.System.Web.Mvc.IController.Execute(ControllerContext controllerContext) 
+4
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) 
+212
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) 
+36
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) 
+4
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
+358
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean
& completedSynchronously) +64

注意加下划线的部分:不是明明有回传的值"00000000-0000-0000-0000-000000000000"吗,怎么变成了空字符串了呢?谁吃了我的参数值?
  经过两个小时艰苦卓绝的调查取证(其中包含了到处搜索Asp.net MVC preview 2源码,以及试图使用Reflector重建源项目未遂),最后灵机一动,把"id"改成"taskId",于是就一切正常了.

  结论很显然,"id"这个参数名在默认情况下是受到特殊对待的,只能在URL里附带,不能post..
Tag标签: asp.net mvc

posted on 2008-03-12 12:53 deerchao 阅读(193) 评论(2)  编辑 收藏 网摘

评论

#1楼  2008-04-08 11:22 只有博主才能看到 [未注册用户]

是不是因为在路由里的设置呢。   回复  引用    

#2楼  2008-05-27 22:01 没剑      

p2 未发现有这种情况   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:


相关搜索:
asp.net mvc

相关链接:



 
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

给网络添加价值,就是让自己增加价值.

本博客所有内容,均为原创或对互联网已有资源的再加工,希望对你有用.在声明原作者的前提下,你可以任意使用,但本人对其正确性,使用的后果等不做任何担保,也不负任何责任.

正则表达式30分钟入门教程 v2.21 2007-8-3

I Want Spec#!

与我联系

搜索

 

常用链接

留言簿(66)

我管理的小组

我的标签

随笔档案(127)

文章分类(9)

文章档案(9)

新闻档案(9)

Links

积分与排名

最新评论

评论排行榜