1

背景:总的来说,我对 MVC、c# 和 .net 非常陌生。我正在使用 Visual Studio 2012 中的 MVC4 互联网应用程序模板。

我想使用引导程序的警报类而不是 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>
}

它位于 Login.cshtml 视图中,并在登录失败时弹出警告样式框。

有人对如何使用自定义 html/css 显示模型绑定错误有更好的建议吗?我只是根据谷歌搜索和猜测把它放在一起,任何建议都将不胜感激。

发现了这个类似的问题:Change default ValidationSummary template in MVC4

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

4

2 回答 2

2

您可以编写自定义 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()。没有测试代码,可能有错误。

于 2013-05-03T21:00:56.827 回答
1

老实说,最灵活的方法是让控制器返回 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);
    }

并有一个执行 onSuccess 的函数,类似于:

@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);
    }
}
于 2013-05-03T06:00:05.167 回答