【发布时间】:2010-11-02 01:07:01
【问题描述】:
在从 /Controller/Action/1 等 URL 返回的视图中(假设默认路由为 controller/action/id),如何从视图中访问 ID?
我不想在处理请求时将其添加到操作级别的 ViewData 字典中。
【问题讨论】:
-
为什么不想将它添加到 ViewData 字典中?这就是为您所描述的内容提供的机制。
标签: asp.net-mvc
在从 /Controller/Action/1 等 URL 返回的视图中(假设默认路由为 controller/action/id),如何从视图中访问 ID?
我不想在处理请求时将其添加到操作级别的 ViewData 字典中。
【问题讨论】:
标签: asp.net-mvc
我想这就是你要找的东西:
<%=Url.RequestContext.RouteData.Values["id"]%>
【讨论】:
ViewData 正是这样做的正确方法。
您的另一个选择是将包含 ID 的模型传递给视图。
编辑:在不确切知道自己要做什么的情况下,很难给出更具体的建议。为什么需要 ID,而不需要任何其他模型数据?您的控制器真的只将 Id 字段发送到视图吗?很难想象这是什么场景。
如果 ID 值确实是传递给您的视图的唯一模型信息,那么您可以将 ID 本身用作模型。那么你的action方法的返回值就是View(id),你就不需要使用ViewData了。
【讨论】:
ViewData["id"] = id; 的一些事情并不适合我。我想这是我多次使用这种模式的事实。一次或两次,我可能不会介意。谢谢。
将它添加到 viewdata 是正确的做法。至于如何添加它,您始终可以添加一个自定义的ActionFilter,它从路由字典中抓取它并将其推送到视图数据中。
【讨论】:
如果您使用的是 .NET Core
使用此代码
Url.ActionContext.RouteData.Values["id"]
【讨论】:
Razor 中的简单答案:
@Url.RequestContext.RouteData.Values["id"]
在 ASP.NET Core 中
@Url.ActionContext.RouteData.Values["id"]
【讨论】:
我们可以将id 传递为Route Data 或QueryString,所以为了同时支持它们,我推荐这种方式:
var routeValues=Url.RequestContext.RouteData.Values;
var paramName = "id";
var id = routeValues.ContainsKey(paramName)?
routeValues[paramName]:
Request.QueryString[paramName];
【讨论】:
我认为您可以直接在 url 操作中使用 Url.RequestContext.RouteData.Values["id"]
【讨论】:
只是我的两分钱,但我总是使用视图模型将任何数据传递给我的视图。即使它就像需要一个 int 这样的 ID 一样简单。
这样做会使访问该值变得微不足道,因为 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>
【讨论】: