在没有模型的情况下在 MVC 中引发验证错误

Posted

技术标签:

【中文标题】在没有模型的情况下在 MVC 中引发验证错误【英文标题】:Throwing a Validation Error in MVC without a Model 【发布时间】:2015-06-18 15:37:26 【问题描述】:

我有一个对一个模型进行强类型化的视图,但上面有一个表单可以发布到另一个模型。当用户将注释留空但无法弄清楚时,我需要发回验证错误。这是视图中的表单:

@using (html.BeginForm())

    @Html.AntiForgeryToken()

    <div class="col-md-12 col-xs-12">
        <div class="form-group">
            @*@Html.HiddenFor(model => model.TicketId)*@
            @Html.Label("New Note", new  @class = "control-label" )
            @Html.TextArea("Note", new  cols = 600, @rows = 5 )
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Add" class="btn btn-default" />
            </div>
        </div>
    </div>

这是我的控制器代码:

[HttpPost]
public ActionResult EditUserTicket(Guid id, string Note)

    if (Note != "")
    
        AddTicketNote(Guid.Parse(Session["LoggedUserID"] as string), id, Note, true);  
    

    return RedirectToAction("EditUserTicket", id);

【问题讨论】:

如果可能的话,我建议强烈键入它以完全避免这种情况。只需创建一个 NoteViewModel 并将它的实例添加到父级拥有的任何模型中。然后只需使用必需的属性和 ValidationMessageFor 即可获得简单的解决方案。 @br4d 这是我正在创建的帮助台软件。我没有这样做的原因是上面是附加到模型的票证表,该模型对视图进行了强类型化。然后在表格下方是附在这张票上的所有注释的列表。中间的这个表格是为了让用户可以在工单上添加一个新的注释。有没有办法我仍然可以使用视图模型来做到这一点? @djblois 我的回答有帮助吗? 是的,我想是的,杰米,我现在正在努力。 【参考方案1】:

有几种方法可以实现这一点。 这就是我会做的:

查看:

@using (Html.BeginForm())

@Html.AntiForgeryToken()

<div class="col-md-12 col-xs-12">
    <div class="form-group">
        @*@Html.HiddenFor(model => model.TicketId)*@
        @Html.Label("New Note", new  @class = "control-label" )
        @Html.TextArea("Note", new  cols = 600, @rows = 5, id = "noteArea" )
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input id="submitBtn" type="submit" value="Add" class="btn btn-default" />
        </div>
    </div>
</div>

<script>
$(function() 

    $('#submitBtn').click(function (e) 
        if($('#noteArea').val() == "")
        
           e.preventDefault();
           alert("Please enter a note"); //You could append some HTML somewhere (I dont like alerts)
        
    );  
);
</script>

控制器:

[HttpPost]
    public ActionResult EditUserTicket(Guid id, string Note)
    
        if (Note != "")
        
            AddTicketNote(Guid.Parse(Session["LoggedUserID"] as string), id, Note, true);  
        
        TempData["NoteError"] = true;
        return RedirectToAction("EditUserTicket", id);
    

然后在您的EditUserTicket ActionMethod 中检查TempData["NoteError"] 是否不为空并检查该值。如果它不为 null 且为 true,则该注释为空。

在我看来,您不应该只做客户端或服务器端。如果您要进行验证,您应该在客户端服务器上进行。

【讨论】:

【参考方案2】:

您始终可以使用客户端 jquery 进行 asp.net mvc 附带的验证。

确保在 BundleConfig.cs jquery.validate 中包含并调用布局中的包。

那么在你看来

    $("#myForm").submit(function (e) 
        e.preventDefault();
        var validator = $("#myForm").validate().form();
        if (validator) 
                //do something you can alway send to server and do another validation
        
    );

不要忘记在您的表单中 @Html.ValidationMessage 为您希望出现错误的每个字段

【讨论】:

如果他愿意,您不阅读我代码中的引用吗?他总是可以将 ajax 发送回服务器并进行另一次验证

以上是关于在没有模型的情况下在 MVC 中引发验证错误的主要内容,如果未能解决你的问题,请参考以下文章

MVC .Net Core 模型验证 - 值“”无效。错误

你可以在没有模型的情况下在 Django 中运行原始 MySQL 查询吗?

在没有 android studio 的情况下在本地运行 flutter web 应用程序会引发 firebase 错误

如何在没有控制器调用的情况下在项目内的任何地方调用模型方法?

在没有在模型中定义的情况下在 rails 中创建 slug

我可以在没有自动 ID 的情况下在 Django 中创建模型吗?