15

我想重定向到其他 Controller 中的操作,但它不起作用这是我在 ProductManagerController 中的代码:

[HttpPost]
public ActionResult RedirectToImages(int id)
{
    return RedirectToAction("Index","ProductImageManeger", new   { id=id   });
}

这在我的 ProductImageManagerController 中:

[HttpGet]
public ViewResult Index(int id)
{
    return View("Index",_db.ProductImages.Where(rs=>rs.ProductId == id).ToList());
}

它很好地重定向到 ProductImageManager/Index 没有参数(没有错误),但是使用上面的代码我得到了这个:

参数字典包含“...Controllers.ProductImageManagerController”中方法“System.Web.Mvc.ViewResult Index(Int32)”的不可为空类型“System.Int32”的参数“ID”的空条目。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数

4

4 回答 4

22

这个错误非常不具描述性,但这里的关键是“ID”是大写的。这表明路由没有正确设置。要让应用程序处理带有 id 的 URL,您需要确保至少为其配置了一个路由。您可以在 App_Start 文件夹中的RouteConfig.cs 中执行操作。最常见的是将 id 作为可选参数添加到默认路由。

public static void RegisterRoutes(RouteCollection routes)
{
    //adding the {id} and setting is as optional so that you do not need to use it for every action
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

现在您应该能够按照您设置的方式重定向到您的控制器。

[HttpPost]
public ActionResult RedirectToImages(int id)
{
    return RedirectToAction("Index","ProductImageManager", new { id });

    //if the action is in the same controller, you can omit the controller:
    //RedirectToAction("Index", new { id });
}

在过去的一两次场合中,我通过正常重定向遇到了一些问题,不得不通过传递RouteValueDictionary来解决问题。有关带参数的 RedirectToAction 的更多信息

return RedirectToAction("Index", new RouteValueDictionary( 
    new { controller = "ProductImageManager", action = "Index", id = id } ) 
);

如果你得到一个非常相似的错误,但使用小写的 'id',这通常是因为路由需要一个尚未提供的 id 参数(调用没有 id 的路由/ProductImageManager/Index)。有关更多信息,请参阅此问题

于 2013-11-12T13:33:29.130 回答
-1

这应该工作!

[HttpPost]
public ActionResult RedirectToImages(int id)
{
    return RedirectToAction("Index", "ProductImageManeger", new  { id = id });
}

[HttpGet]
public ViewResult Index(int id)
{
    return View(_db.ProductImages.Where(rs => rs.ProductId == id).ToList());
}

请注意,如果您返回的视图与操作实现的视图相同,则不必传递视图的名称。

您的视图应该像这样继承模型:

@model <Your class name>

然后,您可以在视图中访问您的模型:

@Model.<property_name>
于 2018-06-07T20:00:48.600 回答
-2
return RedirectToAction("ProductImageManager","Index", new   { id=id   });

这是一个无效的参数顺序,应该首先采取行动

确保您的路由表是正确的

于 2013-11-12T13:06:12.507 回答
-2

尝试这个,

return RedirectToAction("ActionEventName", "Controller", new { ID = model.ID, SiteID = model.SiteID });

在这里我提到你也传递了多个值或模型。这就是为什么我在这里提到这一点。

于 2013-11-12T13:10:12.743 回答