【问题标题】:optional parameter must be a reference type MVC4 C#可选参数必须是引用类型 MVC4 C#
【发布时间】:2018-05-24 17:33:38
【问题描述】:

我一直在开发 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>

但得到下一个错误

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

这是我的 Home 控制器中的操作

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 }
        );
    }
}

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

【问题讨论】:

  • 您确定ViewBag.grupoViewBag.correlativo 中的值有效吗?
  • 是的,有有效值

标签: c# asp.net-mvc


【解决方案1】:

您当前的代码正在为这样的链接生成 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方法注册的默认路由模式中定义了。

【讨论】:

    【解决方案2】:
    <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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2014-12-03
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      相关资源
      最近更新 更多