【问题标题】:MVC @Html.TextAreaFor validation not workingMVC @Html.TextAreaFor 验证不起作用
【发布时间】:2016-05-09 15:48:05
【问题描述】:

我在包含 textBox 和 textArea 的表单上遇到问题。这个论坛是共享视图。 textBox 正在验证,但 textArea 没有。我经历了很多其他人面临的问题,但似乎无法解决。我在我的应用程序中创建了另一个表单,并且验证在 textArea 上工作

表单是一个动态创建的问题页面。

@for (var i = 0; i < Model.QuestionAnswers.Count; i++)
{
        @switch (Model.QuestionAnswers[i].QuestionType)
        {
            case QuestionTypeEnum.SentenceRequired:
                @Html.TextAreaFor(m => m.QuestionAnswers[i].Answer, 5, 20, new { @class = "input-xlarge persistLocal",
                required = "required" })
                break;


            case QuestionTypeEnum.TextBoxRequired:
                @Html.TextBoxFor(m => m.QuestionAnswers[i].Answer, new {@class = "input-xlarge persistLocal", required = "required" })
                break;
         }
}

这是我的模型,我没有在模型上使用属性,因为当我生成表单时,有些问题不是必需的。我已经尝试过了,但它仍然无法正常工作。

 public class QuestionAnswerViewModel
{

    public List<QuestionAnswer> QuestionAnswers { get; set; }
}

/// <summary>
/// 
/// </summary>
public class QuestionAnswer
{
    public string Answer { get; set; }

    public string Question { get; set; }

    public int PermitRequestTypeQuestionId { get; set; }

    public QuestionTypeEnum QuestionType { get; set; }

    public int AnswerId { get; set; }


    [DisplayName("Question")]
    public string QuestionAndAnswerText
    {
        get { return string.Format("{0} <strong>{1}</strong>", Question, Answer); }
    }
}

这是我论坛的截图

这些是加载到视图中的脚本

在父视图中,我尝试添加它以尝试强制验证 $.validator.unobtrusive.parse("#formName");

这是控制台的输出

我认为这可能是两个 textarea 标签之间的一些空白,但它似乎不是,并且 javascript 控制台窗口中没有错误,正如我之前所说,它适用于文本框。我还尝试将其更改为 EditFor 并将模型属性更改为使用 multiline 属性和 required 属性,但仍然没有乐趣。

任何正确方向的帮助将不胜感激,谢谢

【问题讨论】:

  • 您是否尝试使用 [Required] 属性来装饰 Answer 属性?
  • @ataravati 我确实尝试过但没有用,我不这样做的原因是因为每个文本框都可能是必需的,所以我不能用 required 属性标记属性.
  • 但是,您可以创建一个自定义 RequiredIf 属性,该属性根据模型中另一个属性的值使该字段成为必填字段。只需查找RequiredIf,您就会找到一个。
  • 顺便说一下,您的QuestionAndAnswerText 属性违反了MVC 哲学。您正在 ViewModel 中执行视图中应该执行的操作。您可以为 QuestionAnswer 模型创建局部视图,而不是这样做,将其命名为 QuestionAnswer.cshtml,并将其放在 Views\Shared\DisplayTemplates 下。然后,您可以使用@Html.DisplayFor() 来显示它。
  • required = "required" 是 HTML-5 验证,与 jquery 验证无关(在您查看或使用 @Html.ValidationMesageFor() 时添加 jquery.validate.jsjuery.validate.unobtrusive.js 毫无意义。您的代码将不给你服务器端验证。你需要使用应用于你的属性的验证属性来让它们有任何意义。

标签: javascript asp.net-mvc validation asp.net-mvc-4


【解决方案1】:

尝试将[Required] 属性添加到属性模型中。

类似这样的:

[Required]
public string Answer { get; set; }
[Required]
public string Question { get; set; }

【讨论】:

  • @InitLipton,手动创建 js/jq 脚本来验证这些 textBox 和 textArea。或者您可以从这里使用 jQuery 验证插件:plugins.jquery.com/validate
【解决方案2】:

因为我没有从这个局部视图发回服务器,所以这段 Javascript 被用来验证局部视图

        var validator = $("form").validate(); // obtain validator
            var anyError = false;
            $step.find("input").each(function() {
                if (!validator.element(this)) { // validate every input element inside this step
                    anyError = true;
                }

            });

            if (anyError)
                return false; // exit if any error found

JQuery 没有选择 textArea 因为它不存在。

$step.find("input,textarea").each(function()

【讨论】:

    【解决方案3】:

    尝试将 TextAreaFor 替换为 EditorFor。由于您的模型已经设置了多行标志,因此这不会影响您的 UI,但它应该可以解决 TextAreaFor 的潜在错误(以及过去记录的某些版本)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      相关资源
      最近更新 更多