2017-03-23 113 views
1

最近我遇到了以下问题。让我们假设,我们有以下里面GET方法控制:ASP.NET MVC Attribute Routing - 参数始终为空

[RoutePrefix("admin-panel")] 
public class AdminPanelController : Controller 
{ 
    [Route("places/edit/{placeId}")] 
    public ActionResult EditPlace(int? placeId) 
    { 
    return View("EditPlace", new EditPlaceViewModel(...)); 
    } 
} 

现在我们可以通过URL来访问这个方法:

(...)/管理面板/地/编辑/ 123

的问题是,placeId参数始终是

如果我改变EditPlace方法路由规则如下:

[RoutePrefix("admin-panel")] 
public class AdminPanelController : Controller 
{ 
    [Route("places/{placeId}/edit")] 
    public ActionResult EditPlace(int? placeId) 
    { 
    return View("EditPlace", new EditPlaceViewModel(...)); 
    } 
} 

一切都开始正常工作 - placeId参数被successfuly通过。

我在这里错过了什么?为什么我不能使用第一个解决方案?

在此先感谢!

@Update

OK,我已经错过了,我有看起来像相同的路由规则的POST方法:

[HttpPost] 
[Route("places/edit/{placeId}")] 
[MultipleSubmitButton(Name = "action", Argument = "NextEditStep")] 
public ActionResult NextEditStep(int? placeId, EditPlaceViewModel model) 
{ 
    // do some operations with posted model 
    return View("EditPlace", new EditPlaceViewModel(...)); 
} 

[HttpPost] 
[Route("places/edit/{placeId}")] 
[MultipleSubmitButton(Name = "action", Argument = "PreviousEditStep")] 
public ActionResult PreviousEditStep(int? placeId, EditPlaceViewModel model) 
{ 
    // do some operations with posted model 
    return View("EditPlace", new EditPlaceViewModel(...)); 
} 

如果我把它们注释掉,问题走开,但说实话 - 我需要它,因为形成发电。有没有机会让这三种方法具有相同的路由规则?

我有类似的控制器与类似的3种方法(1 GET & 2 POSTS),但他们没有任何路由参数。无论如何,这种路由的工作方式很好,并且表现得如预期一样。唯一的区别是第一个有路由参数,第二个没有。

+0

你有任何其他操作方法与途径模式? – Shyju

+0

感谢您的反馈 - 我有另一个GET属性为'[Route(“places/add”)]',另一个为'[Route(“places”)]''。 – smq93

+2

'admin-panel/places/edit/123'应该按照您共享的代码工作。 – Shyju

回答

0
[Route("places/edit/{placeId: int}")] 

试试这个

+0

虽然这段代码可能会回答这个问题,但提供关于为什么和/或代码如何回答这个问题的附加上下文会提高它的长期价值。 – manniL