Asp.net MVC 操作 link

Asp.net MVC action link

我正在编写我的第一个 MVC 应用程序。在创建 link 以打开详细信息视图时,我必须传递 id。

控制器方法如下:

public ActionResult getDetails(int UserMasetrId) 
{
    ...Some Code 
}

在 VIEW link 中生成如下:

<a title="View Details" href="@Url.Action("getDetails", "UserMaster", new {id=item.UserMasterId})"></a>

对于上面的代码 link 生成为 ...controllername/getDetails/13616。但它抛出错误:

"The parameters dictionary contains a null entry for parameter 'UserMasterId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult getDetails(Int32)' in 'APP.Controllers.UserMasterController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."

现在,如果我按如下方式更改操作 link?

<a title="View Details" href="@Url.Action("getDetails", "UserMaster", new {UserMasterId=item.UserMasterId})"></a>

它工作正常但 link 更改为 ...controllername/getDetails?UserMasterId=13616

所以请建议任何参数名称的解决方案,因为我在操作方法中写了,我希望 url 的格式不显示参数名称意味着 url 的格式应该 conrtoller/actionmethod/parametervalue

函数中的参数名称应与按钮中的查询参数匹配 link。

<a title="View Details" href="@Url.Action("getDetails", "UserMaster", new { UserMasterId = item.UserMasterId})"></a>

如果您不使用默认 Id 参数,您还应该声明一个路由。

[Route("ControllerName/getDetails/{UserMasterId}")]
public ActionResult getDetails(int? UserMasterId) 
{
   if (id == null)
   {
      return NotFound();
   }
}

您使用的不是ActionLink。您正在为您的 href 操作生成一个 link。您可以使用 HtmlHelper 生成适当的 a 标记:Html.ActionLink 如下所示:

Html.ActionLink("", "getDetails", "UserMaster", new { item.UserMasterId }, null)

假设 item.UserMasterId 为 1:

,这将生成这样的锚标记
<a href="/UserMaster/getDetails/1"></a> 

并将您的 Controller 方法更改为:

public ActionResult getDetails(int? id) 
{
    ...Some Code 
}

如果你刚开始学习MVC,最好是学对了。您应该使用 Route 参数,而不是 QueryString 参数。所以让你的link保持原样

<a title="View Details" href="@Url.Action("getDetails", "UserMaster", new {id=item.UserMasterId})"></a>

但是修复动作,你的动作不是MVC风格,应该是

[Route("{userMasterId?}")]
public ActionResult getDetails(int? userMasterId) 
{
    ...Some Code 
}

但是名称并不重要,重要的是路由参数和动作参数名称应该相同,你也可以使用这个

[Route("{id?}")]
public ActionResult getDetails(int? id) 
{
    ...Some Code 
}

根据所有建议,在实施这些建议后,我决定在 link 和操作方法参数名称中,如果您使用默认路由器中建议的相同参数名称,URL 将生成作为
ControllerName/actionMthod/value
在所有其他情况下它将生成
ControllerName/actionMthod?ParamerName=value.