可选参数必须是引用类型MVC4 C#

时间:2018-05-24 17:33:39

标签: c# asp.net-mvc

我一直在研究MVC4 C#应用程序,并通过链接向控制器发送一个值

<a href="@Url.Action("MyAction", "Home", new { Id = @ViewBag.id})">@ViewBag.option2</a>

并且工作正常,但现在我需要通过相同的链接将三个值发送到同一个控制器并验证值不为空

<a href="@Url.Action("MyAction", "Home", new { Id = @ViewBag.id, Id2 = @ViewBag.grupo, Id3 = @ViewBag.correlativo })">@ViewBag.option2</a>

但是得到下一个错误

  

Message =参数字典包含非可空类型'System.Int32'参数'grupo'的空条目,方法'System.Web.Mvc.ActionResult ModificarOrdenInicioFormulario(System.String,Int32,Int32)'' GFC_Site.Controllers.HomeController”。可选参数必须是引用类型,可空类型,或者声明为可选参数。参数名称:参数

这是我的家庭控制器中的操作

public ActionResult MyAction(string Id, Int32 grupo, Int32 correlativo)

这是我的RouteConfig

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapMvcAttributeRoutes(); 
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

你能告诉我要添加什么或错误在哪里吗?

2 个答案:

答案 0 :(得分:2)

您当前的代码正在生成此链接的href属性值

Home/MyAction/10?id2=123&id3=456

但您的操作方法参数为Idgrupocorrelativo

您的操作方法参数名称应与路径值字典键匹配

使用grupocorrelativo作为路线值项目键,而不是id2id3

<a href="@Url.Action("MyAction", "Home", 
         new { Id = @ViewBag.id, 
               grupo = @ViewBag.grupo, 
               correlativo = @ViewBag.correlativo })">@ViewBag.option2</a>

这将生成像这样的href属性值,它具有与动作方法参数名匹配的正确查询字符串

Home/MyAction/10?grupo=123&correlativo=456

这应该有效,假设您的ViewBag项目设置了有效(非空)数值。如果这些可能为null,请考虑将您的操作方法参数从int更改为nullable int(int?

url中的路由值10将自动映射到名为Id的参数,因为我们在RegisterRoutes方法中注册的默认路由模式中定义了该值。

答案 1 :(得分:1)

<a href="@Url.Action("MyAction", "Home", new 
                                           { 
                                             Id = @ViewBag.id, 
                                             grupo = @ViewBag.grupo, 
                                             correlativo = @ViewBag.correlativo 
                                            })">@ViewBag.option2</a>

您的参数名称必须相同。要处理空案例,您可以将操作签名更改为public ActionResult MyAction(string Id, Int32? grupo, Int32? correlativo)