0

我最近在我的形式实现远程验证:远程验证原因提交输入(多提交-按钮)为空

视图模型:

[Remote("IsTagUnique", "myController", "myArea", ErrorMessage = "This tag already exists.")] 
public string tag { get; set; } 

控制器:

 public ActionResult IsTagUnique(string tag) 
     { 
      using (db) 
      { 
       try 
       { 
        var myTag = db.ASAuftraege.Single(m => m.tag == tag); 
         return Json(false, JsonRequestBehavior.AllowGet); 
        }       
       } 
       catch (Exception) 
       { 
        return Json(true, JsonRequestBehavior.AllowGet); 
       } 
      } 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult myView(string Send){ 
      // doSomething 
     } 

查看(称为“myView”)

@Html.TextBoxFor(m => m.tag) @Html.ValidationMessageFor(m => m.tag) 


<button class="form-button-submit" type="submit" name="Send" value="Send">Send</button> 

验证工作非常好。

问题是:单击发送按钮时,如果没有手动触发标记字段的验证,只需单击该字段,然后单击其他位置,在“myView()”函数之前执行“IsTagUnique”函数。这导致我的提交输入(我实际上有多个发送按钮,就像视图中显示的那样(当然不同的名称/值)是空的任何想法我能做什么?我尝试通过手动触发验证聚焦和模糊标签字段,通过触发更改事件不会触发验证,虽然

回答

0

搜索了一会儿,我发现这似乎是一个已知的错误之后:

当一个表单使用远程方法来验证一个字段时,如果在验证器触发后按下了一个提交按钮,那么一切正常,请求将包含点击提交按钮的名称/值对 但是,当远程方法是在按下提交按钮之前未触发,则结果请求将不包含提交按钮值/对。

为我工作一个解决方案是这一个:

$(function() { 
$('button[type=submit]').click(function() { 
    $('<input>').attr({ 
     type: 'hidden', 
     name: this.name, 
     value: this.value 
    }).appendTo($(this).closest('form')); 
}); 
}); 

感谢arturoribes