2010-11-15 14 views
6

Aktualnie używam ASP.NET MVC3 RC i używam dyskretnych walidacji JQuery, jak to opisał Brad Wilson na his blog. Działa wspaniale, ale kiedy wysyłam mój formularz (w Ajax) do serwera, robię pewne weryfikacje po stronie serwera i zwracam ten sam wiersz (który jest zawarty w częściowym widoku), jeśli mój stan modelu jest niepoprawny. 2 problemy z tym:PartialView i dyskretna weryfikacja klienta nie działa

Pierwsza: Kiedy wykonuję return PartialView w moim działaniu, wszystkie dyskretne atrybuty nie są renderowane. Znalazłem "nie elegancką" metodę, ale kiedy to robię, sprawdzanie poprawności klienta jest zepsute. Po powrocie z działania, nawet jeśli zadzwonię pod numer jQuery.validator.unobtrusive.parse() w zaktualizowanym wierszu, zawsze zwracam wartość true, nawet jeśli nie jest tak.

2nd: Chcę, aby mój renderowany widok był renderowany jako ciąg znaków na serwerze, aby można było wysłać go z powrotem w JsonResult (np. myJSonResult.html=RenderPartialToString("partialName",model)).

ma odwołanie, nie ma moim zdaniem (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> 

I moje działania kontrolera:

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

Dzięki

Odpowiedz

4

I wreszcie zrobić to działało. W ten sposób:

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

Jest funkcje pomocnicze:

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

nie jestem pewien, że to najlepszy sposób, aby to zrobić, ale pracował dla mnie. Miejmy nadzieję, że zespół ASP.NET MVC zapewni łatwiejszy sposób renderowania widoku w postaci łańcucha.

Dzięki

Powiązane problemy