2010-11-15 3 views
6

J'utilise actuellement ASP.NET MVC3 RC et j'utilise les validations discrètes JQuery décrites par Brad Wilson au his blog. Cela fonctionne très bien mais quand j'envoie mon formulaire (en Ajax) au serveur, je fais quelques validations côté serveur et retourne la même ligne (qui est incluse dans une vue partielle) si mon état de modèle n'est pas valide. 2 problèmes avec cela:La validation du client PartialView et discrète ne fonctionne pas

1er: Lorsque je fais un return PartialView dans mon action, tous les attributs discrets ne sont pas rendus. J'ai trouvé une façon "non élégante" de le faire mais quand je le fais, les validations des clients sont cassées. Après que je reviens de mon action, même si j'appelle jQuery.validator.unobtrusive.parse() sur ma ligne mise à jour, $("form").valid() retourne toujours vrai même si ce n'est pas le cas.

2ème: Je veux que ma vue rendue soit rendue en tant que chaîne sur le serveur afin que je puisse la renvoyer dans un JsonResult (ex: myJSonResult.html=RenderPartialToString("partialName",model)).

a une référence, il y a mon avis (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> 

Et mon action de contrôleur:

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); 
} 

Merci

Répondre

4

Je fais finalement ça a marché. Voici comment:

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

Il y a les fonctions d'aide:

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; 
} 

Je ne suis pas sûr que c'est la meilleure façon de le faire, mais cela a fonctionné pour moi. Espérons que l'équipe ASP.NET MVC offrira un moyen plus simple de rendre une vue sous forme de chaîne.

Remerciements

Questions connexes