假设我有一个如下所示的 URL:用户 IDlocalhost/userdetails/5
在哪里。5
有什么方法可以直接在视图(剃刀视图引擎)中使用 ID 并显示详细信息?还是我在控制器的默认操作中处理它?
5 回答
现在为了简单起见,专注于获取id
视图,您基本上希望使用id
用数据填充模型,然后将其传递给视图。所以在你的控制器中:
public ActionResult Index(int id)
{
UserModel model = db.Users.Where(u => u.Id == id).SingleOrDefault();
return View(model);
}
视图(非常简化)可能如下所示:
@model MyProject.Models.UserModel
@Html.DisplayFor(m => m.Id)
@Html.DisplayFor(m => m.Username)
这是非常基本的。最终,您会意识到应该为视图使用视图模型,而不是直接来自数据源的域模型。这本身就为您提供了另一个问题,需要以将属性从域模型映射到您的视图模型的形式来解决。通常,为此使用AutoMapper或ValueInjecter。不过现在,最好只专注于将数据传递给视图并将其返回到控制器中,以便您可以使用它来做一些事情。
更新
这是一个简单的场景,演示了如何将数据返回到控制器中。所以基本上,你有一个你要提交的表格:
@using (Html.BeginForm("Index", "Home"))
{
// Form elements and submit button
}
这会将数据发布到此操作方法,以便您对数据执行任何操作:
[HttpPost]
public ActionResult Index(UserModel inputModel)
{
// Check to see if the model's data was valid.
if (ModelState.IsValid)
{
// Do something in the database here.
// Then redirect to give the user some feedback.
return RedirectToAction("Thanks");
}
// The model validation failed so redisplay the view.
return View(inputModel);
}
您可以在控制器或视图中使用它作为扩展方法。示例:假设您的路线 ID 持有者在 global.asax 中具有默认值
public int IdFromAdress(HttpContext httpContext)
{
RouteData rd = httpContext.Request.RequestContext.RouteData;
string stringId = (string)rd.Values["id"];
return int.Parse(stringId);
{
您应该使用模型(即模型传递回您的视图)。ViewBag 是另一种选择,但由于 ID 是模型本身的一部分,因此这样做没有任何意义。
看法
@model User
@{
ViewBag.Title = "User Details";
}
@Model.Id;
控制器
public ActionResult UserDetails(int id)
{
return View("UserDetails", (object)id);
}
你可以用这个获取id
@HttpContext.Current.Request.RequestContext.RouteData.Values["id"].ToString()
但我建议使用 ViewMdoel 将值传递给视图而不是 ViewBag 或直接从视图访问
是的你可以。有不止一种方法可以做到这一点,但是由于您已经标记了您的帖子 MVC,假设您想要使用“MVC 方式”,这意味着(imo)使用视图模型。
所以你写了一个视图模型
public class MyViewModel()
{
public int ID {get; set;}
}
您在控制器中填充模型并将其传递给视图
public ActionResut MyView (int id)
{
var viewModel = new MyViewModel {ID = id};
return View (viewModel);
}
然后你有一个强类型视图(强类型到 MyViewModel,即),你可以引用模型的属性
@Model.ID
然后为了使它有用,您可以将您想要使用的任何其他属性添加到您的视图模型中。然后,您可以在呈现视图之前将它们填充到控制器中(例如,显示用户信息),或者让用户在视图中为您填充它们(使用文本框等包装在表单中)。然后您可以像这样在控制器的发布操作中收集用户输入
[HttpPost]
public ActionResult MyView(MyViewModel viewModel)
{
//do stuff with the data from the viewModel
}