代码之家  ›  专栏  ›  技术社区  ›  mberube.Net

部分视图和不引人注目的客户端验证不起作用

  •  6
  • mberube.Net  · 技术社区  · 14 年前

    我目前使用的是ASP.NET MVC3 RC,我使用的是Brad Wilson在 his blog . 它工作得很好,但是当我将表单(在Ajax中)发送到服务器时,如果我的模型状态无效,我会执行一些服务器端验证并返回同一行(包含在部分视图中)。有两个问题:

    第一:当我做一个 return PartialView 在我的操作中,所有不引人注目的属性都不会呈现。我发现了一种“非优雅”的方法来完成它,但是当我这样做时,客户端验证就被破坏了。在我行动结束后,即使我打电话 jQuery.validator.unobtrusive.parse() 在我更新的行上, $("form").valid() 即使不是这样,也要永远返回真值。

    第二:我希望我的呈现视图在服务器上呈现为一个字符串,这样我就可以将它发送回JsonResult(例如: myJSonResult.html=RenderPartialToString("partialName",model) ).

    有参考,有我的视图(editInvitation):

    <td>
        <%= Html.HiddenFor(x=>x.ID,new{id="ID"}) %>
        <%= Html.HiddenFor(x=>x.GroupID,new{id="GroupID"})  %>
        <%: Html.TextBoxFor(x => x.Name, new { id = "Name" })%><%:Html.ValidationMessageFor(x=>x.Name) %>
    </td>
    <td>
        <%: Html.TextBoxFor(x => x.Email, new { id = "Email" })%>  <%:Html.ValidationMessageFor(x=>x.Email) %>
    </td>
    <td>
        <%: Model.Status.ToFriendlyName()%>
    </td>
    <td>
      <%= InvitationsViewModel.RenderActions(Model, Html, InvitationsViewModel.CreateRowID(Model.ID))%>
    </td>
    

    我的控制器动作:

    if (TryUpdateModel(invitation))
    {
        validModel = true;
        //Other stuff
    }
    if (Request.IsAjaxRequest())
    {
         //TODO : I return a partial view but I would prefer to return a JSonResult with the rendered view as a string in an Property of my JSon result
         return PartialView(validModel ? "DisplayInvitation" : "EditInvitation", invitation);
    }
    

    谢谢

    1 回复  |  直到 14 年前
        1
  •  4
  •   mberube.Net    8 年前

    我终于成功了。这就是为什么:

    HtmlHelper helper = GetHelper();
    MvcHtmlString partialView = helper.Partial("myView" , model);
    var result = new { success = ModelState.IsValid, html = partialView.ToString() };
    return Json(result);
    

    有helper函数:

    protected HtmlHelper GetHelper()
    {
        return GetHelper(string.Empty);
    }
    protected HtmlHelper GetHelper(string formID)
    {
        HtmlHelper helper = new HtmlHelper(getViewContext(formID), new ViewPage { ViewData = this.ViewData });
        helper.EnableClientValidation(isClientValidationEnabled());
        helper.EnableUnobtrusiveJavaScript(isUnobtrusiveJavascriptEnabled());
        return helper;
    }
    private ViewContext getViewContext(string formID)
    {
        var vc = new ViewContext(this.ControllerContext, new WebFormView(this.ControllerContext, "~/Views/Home/Index.aspx"), this.ViewData, new TempDataDictionary(), new System.IO.StringWriter());
        vc.UnobtrusiveJavaScriptEnabled = isUnobtrusiveJavascriptEnabled();
        vc.ClientValidationEnabled = isClientValidationEnabled();
        vc.FormContext = new FormContext { FormId = formID };
        return vc;
    }
    

    我不确定这是最好的方法,但它对我有效。我们希望ASP.NET MVC团队能够提供一种更简单的方法来将视图呈现为字符串。

    谢谢