Details(int? id)
这个我用过。不过穿过来的值是空的。这里获取不到值。。是还有其他的地方的原因么?
@cctv男人: 你的路由配置有问题。
@Launcher: 其他的页面都没问题。。登陆 列表查询都可以显示,只有这个传单个id出现问题
@cctv男人: 你其它页面有类似这种传单个参数的场景吗?
@Launcher: 网站所有的 传单个id 接收的页面都有这样的错误。。查询列表都正常的,登陆页正常。
@cctv男人: 检查下你的路由配置,以及你是否增加了额外的 Fiter 之类的。
@Launcher: 没有Fiter的存在。没有更改过。都是原来生成的。
@cctv男人: 那就奇怪了哈~要不你重新装一次 MVC3。
@Launcher: 嗯。愁死我了、、、、、
@cctv男人: 我仔细读了下你的错误,错误的主要原因是 Details(Int32) 方法需要一个不能为空的 Int32 类型的参数值,但是传入的参数的值是空。因此,你修改为 Details(Int32?) 后,观察到 id 的值为空,这正好印证了此错误提示的问题——即 Uri: http://xxxxxxxx/AdminUser/Details/52 中最后一个路径“52”没有被解析出来并保存到参数字典中。
因此,你需要检查下路由匹配规则,还有你本地部署时访问的 URI 是什么样子的,是不是同部署在云中访问时的路径一致。
@Launcher: 路径都是一样的。能加下你qq细说下么?
@cctv男人: 没啥可细说的,我只是想到什么就问一下。你这样测试下,Details(string) ,然后输入 URI:http://xxxxxxxxxx/AdminUser/Details/cctv
@Launcher:
此操作的参数类型“Edm.Int32”和“Edm.String”不兼容。 附近 WHERE 谓词, 列 1, 列 64.
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.EntitySqlException: 此操作的参数类型“Edm.Int32”和“Edm.String”不兼容。 附近 WHERE 谓词, 列 1, 列 64.
源错误:
行 41: public ActionResult Details(string id) 行 42: { 行 43: User user = db.Users.Find(id); 行 44: return View(user); 行 45: } |
出现这样。。
@cctv男人: 怪我,没有说清楚这么改的意义,我是想测试,是否是因为输入的是数字造成值丢失的情况。
public ActionResult Details(string id)
{
User user = db.Users.Find(id == null ? 53 : 54);
return View(user);
}
通过 http://xxxxxxxxxx/AdminUser/Details/cctv 访问时,看下 id 是否是 cctv。
@Launcher: 按照你说的我弄了下。。部分的详细信息页面解决了。。不过有些页面接收类型需要是int的。。还是不行。。页面上包含的数据 挺多的还是有些页面弄不了。。还有其他的弄法么?
@cctv男人: 我还是没讲清楚啊!如果这么访问: http://xxxxxxxxxx/AdminUser/Details/cctv,id 的值是 cctv 吗?如果是的话,你再这样访问: http://xxxxxxxxxx/AdminUser/Details/53,id 的值是 53 吗?
@Launcher: 返回的值不是相对应的53那列。 User user = db.Users.Find(id ==null?53:54);这样写的话 永久的返回 54那列的值。。
@Launcher: http://xxxxxxxxxx/AdminUser/Details/53,id的值不是53
@cctv男人: 那就是说 id 还是空的嘛,uri 上是不是数字没关系。你在 AdminUserController 中 override OnActionExecuting 方法,通过 ActionExecutingContext filterContext 观察下 ActionParameters ,request uri 之类的值。
@Launcher: 好的 。我弄下看看
@cctv男人: 你知道你现在要搞清楚的是什么吗?就是你 uri 最后的那部分路径在服务器解析的时候被过滤掉了,所以你所有 Controller 上的方法的 Action 都没有输入参数的值。也就是说路由规则是 "{controller}/{action}/{id}",但是最后一个参数 {id} 没有解析或解析出来后给扔掉了。
@Launcher: 是的。
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
} 这里是本地 路由。。
@cctv男人: 我跟你说的 override OnActionExecuting ,你没做吧!就是这个样子:
public class AdminUserController
{
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
if (filterContext.ActionParameters.ContainsKey("id"))
{
Uri requestUri = filterContext.HttpContext.Request.Url; // 这里应该是:xxxxx/Adminuser/Details/53
object obj = filterContext.ActionParameters["id"]; // 这里应该是 53
}
base.OnActionExecuting(filterContext);
}
}
mvc把53当成int32类型,你因为是object所以需要传入一个引用类型.int32是值类型.换一个类型吧
换过的不过都不好用 string int int? 都用过的。
问问阿里技术人员
弱弱的问一下,这种传参方式是不是MVC特有的?我没见过,所以想知道这种和“../Details?id=53” 的效果是一样的么?
不是啊。不过mvc 是这样传参的。效果一样的。都是传个id
路由配置 贴出来 然后 控制器的方法参数名也贴下
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
路由
public ActionResult Edit(int id)
{
User user = db.Users.Find(id);
return View(user);
} 控制器
@cctv男人: 那你应该是 控制器/Edit/52 这样的url路径啊
@cctv男人: RouteDebugger