ASP.NET MVC – 将parameter passing给控制器
我有一个操作方法如下的控制器:
public class InventoryController : Controller { public ActionResult ViewStockNext(int firstItem) { // Do some stuff } }
当我运行它时,我得到一个错误,指出:
参数字典中不包含参数“firstItem”的types“System.Int32”的有效值。 要使参数可选,其types应该是引用types或Nullabletypes。
我曾经在一点工作,我决定尝试没有参数的function。 发现控制器不是持久的,我把参数放回去,现在当我调用方法时,它拒绝识别参数。
我正在使用这个URL语法来调用该操作:
http://localhost:2316/Inventory/ViewStockNext/11
任何想法,为什么我会得到这个错误,我需要做什么来解决它?
我试着添加另一个方法,它采取了一个整数的类,它也失败了相同的原因。 我试着添加一个接受一个string,并将string设置为空。 我已经尝试添加一个没有参数,这工作正常,但当然不会满足我的需求。
您的路由需要根据{controller}/{action}/{firstItem}
。 如果您在global.asax.cs
文件中将路由作为默认的{controller}/{action}/{id}
,那么您将需要传入id
。
routes.MapRoute( "Inventory", "Inventory/{action}/{firstItem}", new { controller = "Inventory", action = "ListAll", firstItem = "" } );
…或接近的东西。
你可以把firstItem改成id,它会起作用
你可以改变global.asax上的路由(我不build议这样做)
而且,不能相信没有人提到这个,你可以打电话给:
http://localhost:2316/Inventory/ViewStockNext?firstItem=11
在@ Url.Action将是:
@Url.Action("ViewStockNext", "Inventory", new {firstItem=11});
取决于你在做什么的types,最后会更合适。 你也应该考虑不要做ViewStockNext操作,而应该考虑带索引的ViewStock操作。 (我的2cents)
要改写Jarret Meyer的答案 ,您需要将参数名称更改为“id”或添加如下的路线:
routes.MapRoute( "ViewStockNext", // Route name "Inventory/ViewStockNext/{firstItem}", // URL with parameters new { controller = "Inventory", action = "ViewStockNext" } // Parameter defaults );
原因是默认路由只查找没有参数或称为“id”的参数。
编辑:嘿,没关系Jarret发布后添加了一个路由示例。
Headspring创build了一个不错的库,允许您在操作的属性中为参数添加别名。 这看起来像这样:
[ParameterAlias("firstItem", "id", Order = 3)] public ActionResult ViewStockNext(int firstItem) { // Do some stuff }
有了这个,你不必改变你的路由只是为了处理不同的参数名称。 该库也支持多次应用,因此您可以映射多个参数拼写(重构时方便,而不会破坏公共接口)。
你可以从Nuget中得到它,并在这里阅读Jeffrey Palermo的文章
public ActionResult ViewNextItem(int? id)
使id
整数为可为空的types,不需要string < – > int转换。
或者用Route Attribute来做:
public class InventoryController : Controller { [Route(whatever/{firstItem})] public ActionResult ViewStockNext(int firstItem) { int yourNewVariable = firstItem; // ... } }
还有另一种方法可以实现这一点(在Stephen Walther的寻呼机的例子中有更详细的描述
本质上,你在视图中创build一个链接:
Html.ActionLink("Next page", "Index", routeData)
在routeData中你可以指定名称/值对(例如,routeData [“page”] = 5),并且在控制器的索引函数中相应的参数接收该值。 那是,
public ViewResult Index(int? page)
将页面传递为5.我不得不承认,string(“页面”)自动成为一个variables是非常不寻常的 – 但这也是MVC在其他语言中的工作原理。
“id”特殊处理的原因是将其添加到默认路由映射中。 要改变这个,转到Global.asax.cs,你会发现下面一行:
routes.MapRoute ("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" });
将其更改为:
routes.MapRoute ("Default", "{controller}/{action}", new { controller = "Home", action = "Index" });
或者,您可以尝试将参数types更改为string,然后将该string转换为方法中的整数。 我是MVC的新手,但我相信你需要在你的参数列表中可为空的对象,如何将控制器指示没有这样的参数提供? 所以…
public ActionResult ViewNextItem(string id)...
使用ASP.NET Core Tag Helperfunction:
<a asp-controller="Home" asp-action="SetLanguage" asp-route-yourparam1="@item.Value">@item.Text</a>
- 在ASP.NET MVC Razor视图中用<br />replace换行符
- ASP.NET MVC 1.0 AfterBuilding视图在TFS Build上失败
- 在asp.net-mvc中从服务器读取文本文件的最佳方法是什么?
- Visual Studio 2015-如何禁用“基于您的项目,我们已经确定扩展,你可能会发现有帮助”的消息?
- 在新的ASP.NET MVC 5项目中更新NuGet包引用之后,如何修复与JSON.NET的程序集版本冲突?
- ASP.NET MVC 3 – redirect到另一个动作
- “System.Web.Mvc.MvcWebRazorHostFactory”types的expression式不能用于返回types“System.Web.WebPages.Razor.WebRazorHostFactory”
- 如何在.NET MVC 2中实现正确的HTTPerror handling?
- 如何将整套模型附加到formdata中并在MVC中获取