假设我的网址如下所示:localhost/userdetails/5
其中5
是用户ID。有没有办法直接在视图中使用ID(razor viewengine)并显示详细信息?或者我是否在控制器的默认操作中处理它?</ p>
答案 0 :(得分:1)
为了让事情变得简单,专注于将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)
这是非常基本的。最终,您将意识到应该使用视图模型来查看视图,而不是直接来自数据源的域模型。这本身就是以域模型到viewmodel的映射属性的形式解决的另一个问题。通常,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);
}
答案 1 :(得分:0)
您可以在控制器或View中使用它作为扩展方法。 示例:假设您的路由ID持有者在global.asax
中具有默认值public int IdFromAdress(HttpContext httpContext)
{
RouteData rd = httpContext.Request.RequestContext.RouteData;
string stringId = (string)rd.Values["id"];
return int.Parse(stringId);
{
答案 2 :(得分:0)
您应该使用该模型(即传递回您视图的模型)。 ViewBag是另一种选择,但由于ID是模型本身的一部分,因此没有任何意义。
查看
@model User
@{
ViewBag.Title = "User Details";
}
@Model.Id;
控制器
public ActionResult UserDetails(int id)
{
return View("UserDetails", (object)id);
}
答案 3 :(得分:0)
您可以使用此
获取ID@HttpContext.Current.Request.RequestContext.RouteData.Values["id"].ToString()
但我建议使用ViewModel将值传递给视图而不是ViewBag或直接从视图中访问
答案 4 :(得分:0)
是的,你可以。有不止一种方法可以做到这一点,但是既然你已经标记了你的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
然后,为了使其有用,您可以将您想要使用的任何其他属性添加到视图模型中。然后,您可以在渲染视图之前在控制器中填充它们(例如,显示用户信息),或者让用户在视图中为您填充它们(使用文本框等包装在表单中)。然后你可以在控制器中的post动作中收集用户输入,如此
[HttpPost]
public ActionResult MyView(MyViewModel viewModel)
{
//do stuff with the data from the viewModel
}