直接在视图中使用来自url的id

时间:2012-08-10 13:44:33

标签: c# asp.net-mvc

假设我的网址如下所示:localhost/userdetails/5其中5是用户ID。有没有办法直接在视图中使用ID(razor viewengine)并显示详细信息?或者我是否在控制器的默认操作中处理它?<​​/ p>

5 个答案:

答案 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的映射属性的形式解决的另一个问题。通常,AutoMapperValueInjecter用于此目的。但就目前而言,最好只关注将数据传递给视图并将其恢复到控制器中,以便您可以使用它做任何事情。

更新

这是一个简单的场景,演示了如何将数据恢复到控制器中。基本上,你有一个表格可以提交:

@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
  }