2009-06-11 78 views
74

从URL返回的视图中,例如/ Controller/Action/1(假设controller/action/id的默认路由),我如何才能从视图中访问ID?如何从URL(ASP.NET MVC)中获取视图中的当前路由ID

我不想在处理请求时将它添加到操作级别的ViewData字典中。

+2

为什么你不希望将其添加到ViewData字典?这就是你正在描述的机制。 – 2009-06-11 06:24:41

回答

167

我认为这是你在找什么:

<%=Url.RequestContext.RouteData.Values["id"]%> 
13

ViewData正是这样做的正确方法。

您的其他选项是将包含ID的模型传递给视图。

编辑:不知道你要绑定什么,很难给出更具体的建议。为什么你需要一个ID,但没有任何其他模型数据?你的控制器真的只是发送Id字段到视图?很难想象这种情况是什么。

如果ID值是真正传递给视图的唯一模型信息,那么您可以使用ID本身作为模型。那么你的动作方法的返回值是View(id),你不需要使用ViewData。

+0

不幸的是,该视图没有模型。 关于`ViewData [“id”] = id;`只是不坐在我身边。我猜这就是我正在使用这种模式的事实。一次或两次,我可能不介意。 谢谢。 – JMS 2009-06-11 06:30:35

3

将它添加到viewdata是正确的。至于如何添加它,你总是可以添加一个自定义ActionFilter,它从路由字典中抓取它并将其推入viewdata。

+0

我喜欢这个想法,用适当的空值检查你会把它放在你的控制器的顶部,你应该能够总是依靠它在那里,当它应该是。 – 2009-06-11 17:33:42

+0

或者只是做一个很好的小ViewDataWrapper类,可以管理“如果这是null”做的东西的东西。 。 。 – 2009-06-11 17:46:07

+0

真棒的想法,谢谢! – JMS 2009-06-14 01:10:29

-1

我只是用<%= model.id %>和它的作品

1

我们可以通过idRoute DataQueryString,所以要的既支持他们我推荐这种方式:

var routeValues=Url.RequestContext.RouteData.Values; 
var paramName = "id"; 
var id = routeValues.ContainsKey(paramName)? 
     routeValues[paramName]: 
     Request.QueryString[paramName]; 
1

我觉得你可以在URL操作直接使用 Url.RequestContext.RouteData.Values [“身份证”]

0

只是我的两分钱,但我总是用视图模型对于任何数据传递给我的看法。即使它只需要像ID一样的int

这样做会使访问这个值变得微不足道,因为MVC会为您完成所有工作。

对于什么是值得我通常name我的视图模型为这样:

{Controller}{ViewName}ViewModel

这有助于保持在规模上组织的事情。

一个例子:

// ~/ViewModels/HomeEditViewModel.cs 
public class HomeEditViewModel 
{ 
    public int Id { get; set; } 
} 

// ~/Controllers/HomeController.cs 
public IActionResult Edit(int id) 
{ 
    return View(new HomeEditViewModel() { Id = id }); 
} 

// ~/Views/Home/Edit.cshtml 
@model HomeEditViewModel 

<h1>Id: @Model.Id</h1>