MVC 4中的自定义模型错误文本

本文关键字:模型 错误 文本 自定义 MVC | 更新日期: 2023-09-27 18:12:01

背景:我对MVC, c#和。net非常陌生。我在visual studio 2012中从MVC4互联网应用程序模板工作。

我想使用bootstrap的警报类来显示模型绑定错误,而不是使用Html.ValidationSummary()生成的无序列表。这是我拼凑出来的乱七八糟的东西:

StringWriter writer = new StringWriter();
foreach (ModelState state in ViewData.ModelState.Values) {
    foreach (var error in state.Errors) {
        writer.Write(error.ErrorMessage);
        break;
        // In this case the error messages are all the same,
        // so I just break out when I get to the first one.
    }
}
if (writer.ToString() != "") {
    <div class="alert">@writer.ToString()</div>
}

在登录中。CSHTML视图,并在登录失败时弹出一个警告样式框。

有没有人对如何使用自定义html/css显示模型绑定错误有更好的建议?我只是在谷歌和猜测的基础上把这些拼凑在一起,任何建议都会非常感激。

发现了这个类似的问题:改变默认的ValidationSummary模板在MVC4

我不知道所提供的解决方案是否允许尽可能多的灵活性,但如果我错了,请告诉我。

MVC 4中的自定义模型错误文本

您可以编写自定义html帮助器以任何您想要的方式显示验证错误。下面只是一个例子。

public static string MyValidationSummary(this HtmlHelper helper) 
{
    string errorMessage = string.Empty;
    if (!helper.ViewData.ModelState.IsValid)
    {
        errorMessage += "<div class='alert'>";
        foreach (var key in helper.ViewData.ModelState.Keys) 
        {
            foreach(var err in helper.ViewData.ModelState[key].Errors)
                errorMessage += "<span>" + helper.Encode(err.ErrorMessage) + "</span> <br>";
        }
        errorMessage += "</div>";           
    }
    return errorMessage;
}

通过上面的帮助器,你可以用@Html.MyValidationSummary()显示你的模型错误。没有测试代码,可能有错误

老实说,最灵活的方法是让控制器返回JSON。您使用ASP的次数越多。Net MVC,你就会越希望你有原始的JSON来工作。下面是一个人为的例子,其中

控制器代码类似于:

    [HttpPost]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public JsonResult Login(LoginView login)
    {    
        if (!ModelState.IsValid)
        {
            var errors = ModelState.Select(kvp => kvp.Value.Errors.Select(e => e.ErrorMessage));
            return Json(new { success = "false", message = errors });
        }
        //Perform whatever actions you need
        // return Json(response);
    }

并在成功上执行一个函数,类似于:

@using (Ajax.BeginForm("Login", "Home", new AjaxOptions
        {
            HttpMethod = "POST",
            OnBegin = "loginBegin",
            OnSuccess = "loginSuccess"
        }))
        {
             //You could create this modelview elsewhere and add any properties you need
             var login = new InputLoginView();
             login.rememberme = true;
             //form code here
        }

其中loginSuccess是一个Javascript函数,类似于:

function loginSuccess(result) {
    if (result.success) {
        window.location = result.returnurl;
    }
    else {
        //whatever actions you want to take
        $('#login_password').val('');
        $('#login-btn').button('reset');
        var msg = new alertMsg();
        msg.title = 'Login Problem';
        msg.body = result.message;
        $('#alertError').trigger('show', msg);
    }
}