良好实践 MVC 条件按钮及其代码

本文关键字:按钮 代码 条件 MVC | 更新日期: 2023-09-27 17:55:53

我正在使用ajax编写MVC3应用程序,但我遇到了一个情况。

只有当条件为真时,我才必须显示 na 按钮。好的,它很容易做到。

@if (Model.AAA == ENUM.AAA)
    {
      <button>OK</button>
    }

但是这个按钮将调用一个 ajax 函数。

现在我的疑问是,我的AJAX代码在哪里?

如果我这样做:

@if (Model.AAA == ENUM.AAA)
    {
      function OK(){
          $.ajax({}); 
      }
      <button>OK</button>
    }

这听起来很丑陋的代码!!可以看出,代码不在正确的位置,但 ajax 代码是"安全的",我的意思是,ajax 代码只有在按钮存在时才存在。

但是如果我将我的代码放在 head 部分,高级用户将能够调用 ajax 函数。

或者如果一个 make @if 子句来包围脚本,我将复制这样的代码

<head type="text/javascript">
   @if (Model.AAA == ENUM.AAA){
      function OK(){
         $.ajax({});
      }
   }
</head>
....
<body>
   ....
    @if (Model.AAA == ENUM.AAA)
    {
      <button onclick="OK()">OK</button>
    }
    ....
 </body>

那么,面对这种情况的最佳实践是什么,最好的方法是什么?

良好实践 MVC 条件按钮及其代码

听起来你几乎想使用Javascript代码片段的存在/缺乏来控制对服务器上调用的访问。不要那样做

您的服务器应始终评估该操作是否可以由相关用户在此时调用。如果用户在浏览器中保持页面打开状态,并且发生了一些应用程序状态更改,这会阻止用户调用该操作,该怎么办?但是他们的浏览器仍然显示按钮?或者,如果一个聪明的用户决定通过在源代码中四处闲逛来玩弄您的 URL?

我建议把javascript放在一个公共的位置,然后从那里调用它,因为这会使你所有的Javascript保持在一起。

只需在标记中包含一个条件,就像您拥有的那样:

@if (Model.AAA == ENUM.AAA)
{
  <button id="OkButton">OK</button>
}

然后稍微调整一下你的Javascript,这样你就不包括Razor(这样它就可以提取到一个外部JS文件中):

<head type="text/javascript">
    WireUpButton();
    function WireUpButton() {
        var okbutton = document.getElementById("OkButton");
        if (okbutton) {
            okbutton.onclick = OK;
        }
    }
    function OK(){
     $.ajax({});
  }
</head>

服务器应控制请求调用并检查正确的状态。 @Andrew Barber指出了这一点,但这不仅仅是让浏览器保持打开状态。但是高级用户可以与没有权限的其他人共享 ajax 请求,或者恶意使用它

试图更深入地回答这个问题,它可能不是像这样的简单脚本,而是一个文件或一些JS库,也许你无法控制ajax正在访问的服务器。在这种情况下,您可能希望复制验证。