C#中Controller向View传递参数的正确实现(不设私有属性)
解决ASP.NET MVC中Controller向View传递用户列表的问题(无需修改User私有属性)
刚从Ruby on Rails转到Windows下的ASP.NET MVC,确实会遇到一些模式和语法上的小适配问题,别担心,你的需求完全可以实现——不用把User类的私有属性改成public,就能在View里正确展示用户列表并生成操作链接。
问题根源
你当前的代码有两个核心问题:
- Controller没有把用户列表传递给View:Rails里默认会把实例变量传给对应View,但ASP.NET MVC需要显式传递模型数据。
- View没有正确调用User类的getter方法:因为你的属性是private的,必须通过public的getter方法来访问数据,而不是直接访问属性名。
分步解决
1. 完善User类的getter方法
首先确保你的User类有所有需要访问的属性的getter方法(你之前只写了getName(),需要补充getId()和getLastName()):
public class User { // 私有属性保持不变 private int id; private String name; private String lastName; // 构造函数不变 public User(int id,String name, String lastname) { this.id = id; this.name = name; this.lastName = lastname; } // 已有的name相关方法 public void setName(String name) { this.name = name; } public String getName() { return this.name; } // 新增id的getter方法 public int getId() { return this.id; } // 新增lastName的getter和setter方法 public String getLastName() { return this.lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
2. 修改Controller,传递用户列表到View
在Index方法里,把生成好的usersList作为参数传给View()方法,这样View就能拿到模型数据了:
public ActionResult Index() { List<User> usersList = new List<User>(); User user1 = new User(1,"Lihuen","Figueroa"); User user2 = new User(2,"Solana", "Pachiorquevich"); User user3 = new User(3,"Vicente", "Corrao"); usersList.Add(user1); usersList.Add(user2); usersList.Add(user3); // 显式将用户列表传递给View return View(usersList); }
3. 修改View,正确展示数据并生成链接
在View里,通过调用User类的getter方法来获取数据,同时用getId()来生成操作链接的参数:
@model IEnumerable<PruebaDeInterfaz.Models.User> @{ ViewBag.Title = "Index"; } <h2>Users list</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table class="table"> <tr> <th>User name</th> <th>User lastname</th> <th>Actions</th> </tr> @foreach (var item in Model) { <tr> <!-- 调用getName()获取用户名 --> <td>@item.getName()</td> <!-- 调用getLastName()获取用户姓氏 --> <td>@item.getLastName()</td> <td> <!-- 调用getId()获取用户ID作为链接参数 --> @Html.ActionLink("Edit", "Edit", new { id = item.getId() }) | @Html.ActionLink("Details", "Details", new { id = item.getId() }) | @Html.ActionLink("Delete", "Delete", new { id = item.getId() }) </td> </tr> } </table>
额外说明
如果你习惯Rails里简洁的属性访问方式,ASP.NET MVC也支持自动属性写法,比如:
public class User { public int Id { get; set; } public string Name { get; set; } public string LastName { get; set; } public User(int id, string name, string lastName) { Id = id; Name = name; LastName = lastName; } }
这种写法会自动生成私有字段和对应的getter/setter,View里可以直接写item.Name、item.Id来访问,代码更简洁,但这和你保持私有属性+手动getter的方式并不冲突——两种写法都符合封装原则,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者Xbmxpx
相关产品推荐
相关产品推荐

