【问题标题】:Each validation summary linked to it's own partial view每个验证摘要都链接到它自己的部分视图
【发布时间】:2016-11-07 21:12:31
【问题描述】:

我的视图由 2 个部分视图加上页面中已有的内容组成。我希望每个视图都有一个验证摘要。一切正常,除了其中一个部分出现错误时,该消息会显示在每个验证摘要中,因此它在页面中出现 3 次。我想解决这个问题。

我在网上看了一点,发现有一种方法可以这样做:

    var SecurityQuestionsErrors = ViewData.ModelState.Where(ms => ms.Key == "SecurityQuestions");
if (SecurityQuestionsErrors.Count()>0)
{
    @Html.ValidationSummary("", new { @class = "" })
}

所以我会在每个部分视图中都有这段代码,以查看错误是否特别针对这个。

当错误来自控制器时(我可以自己添加一个密钥,它工作正常):

            catch (FaultException<IncorrectQuestionFault>)
        {
            // question is incorect
            ModelState.AddModelError("SecurityQuestions", Resources.errors.incorrectQuestion);
        }

但是当错误来自 ViewModel 时,它没有添加密钥并且我搞砸了......

        [Required(ErrorMessageResourceName = "IsRequired", ErrorMessageResourceType = typeof(Resources.errors))]
    [StringLength(40, MinimumLength = 7, ErrorMessageResourceName = "NotLongEnough", ErrorMessageResourceType = typeof(Resources.errors))]
    [Display(Order = 0, Name = "question", ResourceType = typeof(Resources.errors))]
    public string question{ get; set; }

所以我的问题是:我这样做是好方法吗?有没有办法为来自 ViewModel 的错误添加密钥?我应该以其他方式执行此操作吗?

感谢所有帮助:D

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 partial-views asp.net-mvc-viewmodel validationsummary


    【解决方案1】:

    假设这是您的 View 模型属性:

    [Required(ErrorMessageResourceName = "IsRequired", ErrorMessageResourceType = typeof(Resources.errors))]
    [StringLength(40, MinimumLength = 7, ErrorMessageResourceName = "NotLongEnough", ErrorMessageResourceType = typeof(Resources.errors))]
    [Display(Order = 0, Name = "question", ResourceType = typeof(Resources.errors))]
    public string question{ get; set; }
    
    @Html.ValidationSummary(false, "", new { @class = "text-danger" })
    
    
    @Html.LabelFor(x => x.question)
    @Html.EditorFor(x => x.question)
    

    默认情况下,这会将所有验证错误放入自己的 div 中

    如果您试图捕捉控制器上的错误,您可以:

     if (!ModelState.IsValid)
    {
        // the model is invalid
    
        //if you are trying to catch different errors here
        var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
        //Now you have all the errors and can give specific messages for a given error
        ModelState.AddModelError(string.Empty, "Your error goes here");
    }
    

    【讨论】:

    • 我这样做是因为我希望每个视图的所有错误都在同一个位置,并且每个文本框附近都没有错误。错误是法语,但我想你可以明白prntscr.com/d4dltg 我要回到控制器,因为应用程序背后的 Web 服务正在抛出错误,这是我需要捕获它们的地方^^。视图模型验证输入内容的格式,但 Web 服务验证数据本身。
    • @Helpha 我认为我更新的答案将解决您想要完成的任务。
    猜你喜欢
    • 1970-01-01
    • 2013-06-02
    • 2014-09-17
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多