-1

考虑这个控制器动作:

public ActionResult List(int userid = 0)
{
    var campaigns = db.Dyn_Campaigns.Where(c => c.UserID == userid);
    return View(campaigns.ToList());
}

模型中的 UserID 字段是一个 int。

这是视图:

@model IEnumerable<KnockoutExample.Models.Dyn_Campaigns>

@{
    ViewBag.Title = "List";
 }

<h2>List</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
    <th>
        @Html.DisplayNameFor(model => model.DateCreation)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.CompanyID)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.UserID)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Name)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Descr)
    </th>
    ...
</tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.DateCreation)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.CompanyID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.UserID)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Descr)
    </td>
    ...
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
        @Html.ActionLink("Details", "Details", new { id=item.ID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.ID })
    </td>
</tr>
}

</table>

这是我在 global.asax 中的自定义路由:

  config.Routes.MapHttpRoute("MyRoute", "{controller}/{action}/{userid}",
  new { controller = "Campaigns", action = "List", userid = UrlParameter.Optional });

问题是userid参数总是得到默认值(0)。我在这里做错了什么?

4

4 回答 4

1

因为UrlParameter.Optional不是int。userid必须是 int 否则找不到用户 ID。例如:在您的控制器中:

public ActionResult List(int userid = 0)
{
...
}

在您的模型中(例如)

Myclass{
    int id;
}

在您看来:

 @model MyApp.Model.MyClass
 ...
    new { controller = "Campaigns", action = "List", userid =  model.id});

在 Asp.net MVC 4 中,您的视图中的参数和您的 controleur 必须是相同的类型和名称。

于 2013-03-18T15:44:07.690 回答
1

更改您的 registerRoutes 如下

public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     routes.MapRoute("MyRoute", "{controller}/{action}/{userid}",
                    new { controller = "Campaigns", action = "List", userid = UrlParameter.Optional });    

                routes.MapRoute(
                    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id =  UrlParameter.Optional }
                );


            }
于 2013-03-21T10:31:38.953 回答
0

很好地改变参数:

public ActionResult List(int userid = 0)

到:

public ActionResult List(int id)

解决了这个问题。但我仍然不明白为什么该方法不接受相同类型但名称不同的参数。

RouteConfig 如下所示:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id =  UrlParameter.Optional }
        );

        routes.MapRoute("MyRoute", "{controller}/{action}/{userid}",
            new { controller = "Campaigns", action = "List", userid = UrlParameter.Optional });
    }
于 2013-03-20T06:48:51.063 回答
-1

因为如果缺少 userid 作为参数,则 userid 将获取 0 它应该可以为空

 public ActionResult List(int? userid)
{
var campaigns = db.Dyn_Campaigns.Where(c => c.UserID == userid);
return View(campaigns.ToList());
}

根据您的编辑进行编辑

您正在传递参数名称 id,它应该是 userid

@Html.ActionLink("Edit", "Edit", new { userid=item.ID }) |
    @Html.ActionLink("Details", "Details", new { userid=item.ID }) |
    @Html.ActionLink("Delete", "Delete", new { userid=item.ID })
于 2013-03-18T15:53:31.183 回答