单个视图中的多个表单

Posted

技术标签:

【中文标题】单个视图中的多个表单【英文标题】:Multiple forms in a single view 【发布时间】:2013-12-27 05:02:10 【问题描述】:

我的强类型视图中有多个@html.BeginForm,它继承自一个模型。模型中的某些字段是[Required],而有些则不是。提交第二个@Html.BeginForm 时,它不包括第一个@Html.BeginForm 中的一些[Required] Html.TextBoxFor 项目。结果,验证消息显示在第一个 @Html.BeginForm 块中。

如果每个@Html.BeginForm 都可以从不同的模型继承,从而产生独立的TextBoxForValidationFor 集,那就太好了。

问题:有谁知道在提交第二个表单时如何禁止第一个表单中的验证?

【问题讨论】:

【参考方案1】:

好吧,假设您只有一个控制器来处理您的所有表单。首先你需要像这样检查什么表格是空的:

@

    if(!Request["form1"].IsEmpty())
        //sending data form 1...
    
    if(!Request["form2"].IsEmpty())
        //sending data form 2
    
    if(!Request["form3"].IsEmpty())
        //sending data form 3
    


最好将每个表单的控制器或方法分开。

【讨论】:

是的,我对每个表单都有单独的方法,但它们位于一个控制器中,该控制器还控制 3 或 4 个其他视图。我认为下一组 View 可能需要一个新的控制器,我们拭目以待 只是一些可能对您有用的想法,如果您最终自定义验证,为什么不先在客户端处理验证,然后在服务器上处理? 当然我想可以使用自定义 JQuery .blur(function()) 但不能使用内置 MVC ValidationMessageFor。是的,这只是时间问题,一旦系统建立,我会返回并添加客户端验证。感谢您的建议。【参考方案2】:

我试图在我的视图中避免条件逻辑。我认为验证器在一个页面中的多个表单上的行为不像我预期的那样。所以我最终一起删除了验证器和 [Required] 字段,并在控制器中添加了手动验证,如下所示:

StringBuilder sb = new StringBuilder();

if (mm.field1 == null)
    sb.Append("<li>field1 is required</li>");
if (mm.field2 == null)
    sb.Append("<li>field2 is required</li>");

//    .... and on and on

if (sb.ToString != "")
   
    ViewData["validationMessage1"] = "<ul>" + sb.ToString() + "</ul>";
    return View("MyView",mm);
   

//  Process form below here, at this point all required fields have passed validation

【讨论】:

以上是关于单个视图中的多个表单的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单:查询结果定义的字段,单个视图同时更新多个对象

访问视图中的嵌套表单字段(嵌入表单集合)

如何将来自多个视图控制器的数据保存到单个核心数据实体中

我可以在 django 中的单个表单中使用多个表单集,如果可以的话如何?

单个 UIViewController 中的多个集合视图未调用 cellForItemAtIndexPath indexPath

django 通用(类)视图中的多个表单类