【问题标题】:mvc3 - ajax form submit and server side validationmvc3 - ajax 表单提交和服务器端验证
【发布时间】:2012-02-08 07:21:48
【问题描述】:

我确信已经有人问过这个问题,但我一直在尝试所有给出的解决方案,但没有一个给定的解决方案能解决我的问题。可能是我没有正确实现它。

我正在使用 MVC3、剃须刀、jQuery。

我有一个新的用户注册表单。注册成功后,我想在对话框中显示成功消息(注册类型不同)。

如果 ModelState 有任何错误,意味着 ModelState.IsValid == false,我想在 ValidationSummary 中显示错误。

查看

function OnBegin () { alert('begin'); return $('form').validate().form(); }
function OnSuccess () { alert('success'); DisplaySucess()}
function OnFailure () { alert('failure'); }
function DisplaySuccess() {
    var typeOfRegistration = $('input:radio[name=RegistrationType]:checked').val();
    var msg;
    if (typeOfRegistration == 0) {
        msg = "You are successfully enrolled for Algebra classes.";
    }
    if (typeOfRegistration == 1) {
        msg = "You are registered with your email address. Someone would contact you with an email.";
    }
    if (typeOfRegistration == 2) {
        msg = "Thank you for filling up this form. One welcome packet would be delivered with in next 15 days";
    }

    msg = msg.replace(/\n/g, '<br />');
    $('#dialog').html(msg);
    $('#dialog').dialog('open');
}
@model Models.RegistrationModel
@using (Ajax.BeginForm("NewRegistration", "Account", new AjaxOptions() { OnBegin="OnBegin", OnSuccess = "OnSuccess", OnFailure = "OnFailure" }))
{ 
  @Html.ValidationSummary()
    <div>
    Register<br />
    @Html.RadioButton("RegistrationType ", "0", true) New Algebra class<br />
    @Html.RadioButton("RegistrationType ", "1") New user registration by email<br />
    @Html.RadioButton("RegistrationType ", "2") New user registration by mailing address<br/>
   ..some more types
</div>
<div>
    …here I display/hide controls based on Registration type selected.
        <div>
    @Html.LabelFor("UserName")
    @Html.TextBox("UserName")</div>
}

控制器

public ActionResult NewRegistration(RegistrationModel model)
{

         if (Request.IsAjaxRequest())
         {
             if (!ModelState.IsValid) { 
        //Ques: How do I display this in ValidationSummary. 
        return Json(new object[] { false, "Contains Email Address", ModelState.GetAllErrors() }); 
        }
             else { 
        if (UserNameIsTaken){ 
            //Ques: This does not show in ValidationSummary
            ModelState.AddModelError("_FORM", "This username is already taken. Please pick a different username.");
        }
       }
    }
         else if (!ModelState.IsValid) { return View(model); }

}

型号

public class RegistrationModel: IValidatableObject
{
[Required] //this gets displayed in ValidationSummary as Client-side validation
    public string UserName { get; set; }
    .. and all fields here
}
public IEnumerable<ValidationResult> Validate(ValidationContext context)
{
        if (!string.IsNullOrEmpty(UserName) && UserName.Contains(EmailAddress)) {
            yield return new ValidationResult("Username cannot contain email address", new[] { "UserName" });
        }
    }

Web.config 有

UnobtrusiveJavaScriptEnabled="true" 和 ClientValidationEnabled="true"

.js 文件包括

script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript">

script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript">

script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript">

script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript">

我在这里缺少什么?有什么选择吗? 提前致谢。

【问题讨论】:

    标签: ajax asp.net-mvc-3 jquery asp.net-ajax


    【解决方案1】:

    我认为通过 ajax 发布表单只会收到客户端错误。

    服务器端错误,需要通过 Json 返回,然后通过 jQuery 或纯 javascript 在标记中“插入”。

    Here you can see and download a fully working example.

    【讨论】:

    • 经过大量的试验和阅读,我最终还是按照你的建议去做了。当有任何服务器端错误时,我返回 Json 和 false 作为对象的第一个参数。在 OnSucess 中,我抓取错误检查数据 [0] == false(表示错误)并将其插入到 ValidationSummary 标记中。谢谢。
    【解决方案2】:

    在主文件(layout.cshtml)中写入以下引用:

    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery-1.4.4.js")"></script>
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")"></script>
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.js")"></script>
    <script type="text/javascript" src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"></script>
    

    在 web.config 中,将 'false' 设置为 'true':

    <appSettings>
    <!--<add key="ClientValidationEnabled" value="true"/> (enable this when client-side validation is needed) -->
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
    

    在模型中:

    public class ValidUserNameAttribue : ValidationAttribute
    {
      public override bool IsValid(object value)
      {
        return (value != null && value.ToString() == "Bob");
      }
    }
    
    public class Customer
    {
      [ValidUserNameAttribue(ErrorMessage = "please type user name as Bob")] /* for server side validation*/
      public string UserName { get; set; }
    }
    

    在控制器中:

    public class HomeController : Controller
    {
      [HttpGet]
      public ActionResult Index()
      {
        return View(new ValidationModel());
      }
    
      [HttpPost]
      public ActionResult Form(ValidationModel validationModel)
      {
        return PartialView(!ModelState.IsValid ? "Partial/_Form" : "Partial/_Success", validationModel);
      }
    }
    

    索引视图:

    @model MVC3_Ajax_Form_jQuery_Validation.Models.ValidationModel
    
    @{
        ViewBag.Title = "ajax form submit and server side validation";
    }
    
    
    <div id="FormContainer">
        @Html.Partial("Partial/_Form")
    </div>
    

    表单视图:

    @model MVC3_Ajax_Form_jQuery_Validation.Models.ValidationModel
    
    @using (Ajax.BeginForm("Form", new AjaxOptions() { UpdateTargetId = "FormContainer" , OnSuccess = "$.validator.unobtrusive.parse('form');" }))
    {
    
        <p>
            @Html.ValidationMessageFor(m => m.UserName) // (Error Message)
        </p>
    
        <p>
            @Html.LabelFor(m => m.UserName):
            @Html.EditorFor(m => m.UserName)
        </p>
    
        <input type="submit" value="Submit" />
    }
    

    成功视图:

    @model MVC3_Ajax_Form_jQuery_Validation.Models.ValidationModel
    
    User name '@Model.UserName' is valid :)
    

    查看此链接以获取 AJAX 表单中的服务器端验证:http://www.codeproject.com/Articles/460893/Unobtrusive-AJAX-Form-Validation-in-ASP-NET-MVC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多