2010-11-15 13 views
6

Attualmente sto utilizzando ASP.NET MVC3 RC e sto utilizzando le convalide JQuery non invadenti come descritto da Brad Wilson su his blog. Funziona alla perfezione ma quando invio il mio modulo (in Ajax) al server, eseguo alcune convalide sul lato server e restituisco la stessa riga (inclusa in una vista parziale) se lo stato del mio modello non è valido. 2 problemi con questo:PartialView e la convalida del client non invadente non funziona

1: Quando eseguo il return PartialView nella mia azione, tutti gli attributi non invadenti non vengono visualizzati. Ho trovato un modo "non elegante" per farlo, ma quando lo faccio, le convalide dei client sono interrotte. Dopo che torno dalla mia azione, anche se chiamo jQuery.validator.unobtrusive.parse() sulla mia riga aggiornata, $("form").valid() restituiscono sempre true anche se non è il caso.

2nd: Voglio che la mia vista renderizzata sia renderizzata come una stringa sul server, così posso inviarla di nuovo in un JsonResult (es: myJSonResult.html=RenderPartialToString("partialName",model)).

ha un riferimento, c'è mio punto di vista (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> 

E la mia azione di controllo:

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

Grazie

risposta

4

finalmente faccio ha funzionato. Ecco come:

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

C'è le funzioni di aiuto:

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

io non sono sicuro che sia il modo migliore per farlo, ma ha funzionato per me. Speriamo che il team ASP.NET MVC possa fornire un modo più semplice per eseguire il rendering di una vista come una stringa.

Grazie

Problemi correlati