动作方法在控制器中被调用两次

action method is being called twice in the controller

我的 MVC 控制器中的操作被我的 jQuery 代码调用了两次。在做了一些调查后,我发现 link 是由 jQuery 以及 MVC 视图触发的。

$('.treeview-menu li a[name="environments"]').on("click", function () {
    debugger;
    var genericId = $(this).attr('id');
    if (genericId != undefined) {
        $.ajax({
            type: "GET",
            url: "/Configuration/Development",
            data: { 'genericId': genericId } ,
            datatype: "application/json",
            success: function (data) { }
        })
    }
    else {
        return;
    }
});
[HttpGet]
public ActionResult Development(DashBoardViewModel model, string genericId)
{            
    ViewBag.EnvironmentType = "Development";
    DeploymentConfiguration_DAL _deploymentDal = new DeploymentConfiguration_DAL();
    model.Configuration = _deploymentDal.FetchDeploymentConfigurationByEnvironmentID(Convert.ToInt32(Convert.ToInt32(genericId)));
    if (model.Configuration != null)
    {
        return View("Index", model);
    }
    return View("Index");            
}    

查看 link 的填充位置

<li>
    <a href="#"><i class="fa fa-circle-o"></i> Deployment Environment</a>
    <ul class="treeview-menu">
        @foreach (var item in ViewBag.Environments)
        {
            <li>
                <a href="@Url.Action(@item.Name,"Configuration")" id="@item.GenericMasterId" name="environments">
                    <i class="fa fa-circle-o"></i>
                    @item.Name
                </a>
            </li>                                                                                                                         
        }                          
    </ul>
</li>

我面临的问题是应用程序运行时以及单击动态生成的任何 link 之后。操作方法第一次运行并填充我的模型,但不是在我的视图中显示它,而是再次点击操作方法,它填充模型中的 null 因为文本框没有从数据库绑定值。

请帮我解决这个问题。有没有一种方法可以在不使用 jQuery 的情况下在我的操作结果中访问 hrefid 值?

尝试将 @Url.Action(@item.Name,"Configuration") 替换为 href="#"。 =17=].

<a href="#" id="@item.GenericMasterId" name="environments">

这就是为什么您有 2 次调用您的控制器,1 次在 jquery 单击时,另外 1 次在您单击 link 时调用。

正如您在问题中所描述的,发生的情况是:

  • jquery 运行良好(但您的问题代码对视图没有任何作用)
  • href 上的 link 将页面重定向 到新视图

如果您想获取页面并且不重定向,您可以:

  • a 更改为 button type=button
  • return 来自事件处理程序的 false
  • 从事件处理程序调用 event.preventDefault()
  • 删除 href=(通过更改为按钮)
  • 可能会根据其他答案更改为 #,但建议不要这样做,如果没有上述更改之一,也会产生其他副作用。

如果你想重定向(不停留在同一页面),传入id,如你所说"without using jquery"然后改变@Url.Action使用 routeValues 重载:

<a href='@Url.Action(item.Name, "Configuration", new { genericId = item.GenericMasterId })' ... />

您可以扩展 new { genericId = 以包含您需要的其他模型属性(尽管 id 应该足以对您的操作进行一些更改)。