在mvc中传递id或empid的动作参数有什么区别?

Vid*_*iDG 3 c# asp.net-mvc asp.net-mvc-4

我是MVC框架的新手.我对传递参数Name有点困惑.这是我的员工类:

namespace TestApplication.Models
{
    [Table ("Employee")]
    public class Employee
    {
        public int EmployeeId { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
        public int DepartmentId { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

namespace TestApplication.Controllers
{
    public class EmployeeController : Controller
    {
        //
        // GET: /Employee/
        public ActionResult Details(int **empid**)
        {
            EmployeeContext employeecontext = new EmployeeContext();
            Employee employee = employeecontext.employees.Single(emp => emp.EmployeeId == id);
            return View(employee);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的详细信息视图:

@model  TestApplication.Models.Employee 
<div style="font-family :Arial">
    <h2>Employees Details</h2>
    <table style="font-family:Arial ">
        <tr>
            <td>
                <b>Employee Id:</b>
            </td>
            <td>
                @Model.EmployeeId
            </td>
        </tr>
        <tr>
            <td>
                <b>Employee Name:</b>
            </td>
            <td>
                @Model.Name
            </td>
        </tr>
        <tr>
            <td>
                <b>Employee City:</b>
            </td>
            <td>
                @Model.City
            </td>
        </tr>
    </table>
</div>
Run Code Online (Sandbox Code Playgroud)

在这段代码中,当我用/ Employee/Details/1运行这个应用程序时, 它会给我一个错误

参数字典包含'TestApplication.Controllers.EmployeeController'中方法'System.Web.Mvc.ActionResult Details(Int32)'的非可空类型'System.Int32'的参数'empid'的空条目.可选参数必须是引用类型,可空类型,或者声明为可选参数.参数名称:参数

但是当我在操作中使用id作为参数名称时它会完美运行,那么有什么区别?我如何选择参数名称?

Dav*_*idG 6

看看你的默认MVC路线App_Start/RouteConfig.cs,会说出这样的话:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

这就是说,如果你传递一个像那样的URL,/Employee/Details/1那么值的1参数名称id就不会映射到empid.你可以:

  1. 添加另一个允许的路由 empid
  2. 重命名empidid
  3. 使用旧样式网址: /Employee/Details?empid=1