[ tdusko @ 02.03.2012. 12:15 ] @
Generalno jako cesto imam ovaj problem od kako sam poceo da se bavim ovim. Znaci, hocu da u zavisnosti od rezultata neke akcije koja se odigra na serveru logiciram na klijentu. Prost primer:

Web aplikacija koja se sastoji od jedne strane koja ima header, footer i content. Header i footer su konstantni, a Content se menja uz pomoc javascripta i ajax jquery post-a. Prost primer jednog takvog content dela bi bio

- <div id="divContent"> i u njemu forma sa dva input polja i dugme
- klik na dugme poziva javascript metodu
- javascript metoda radi ajax post na neku akciju
- akcija radi nesto i vraca kao rezultat HTML koji ce se prikazati
- javascript metoda u success delu lepi rezultat na content div

E, gde je tu problem? Problem je u tome sto je ovako implementirana javascript metoda glupa i ne zna koji je html dobila. Ukoliko se desila neka greska, controller ce vratiti view sa view modelom, ali metoda nece znati da se desila greska. Ako bih hteo jos dodatno nesto da uradim ne bih mogao. Mislim, mogu da budzim nesto, ali kapiram da mora da postoji nesto uljudnije. Mogu na primer u taj view da stavim non visible div u koji cu preko ViewBag.statusCode (koji cu da setujem u akciji) da ubacim nesto pa u success delu javascript metode da to procitam, ali mi to nesto ne mirise kako treba.

javascript metoda:

Code:

function postRegistrationForm() {
    $('#divContent').hide('slow');
    $.ajax(
    {
        type: "POST",
        url: "/Account/UserRegistration",
        data: $("#frmUserRegistraiton").serialize(),
        success: function (result) {
            $("#divContent").html(result);
            $('#divContent').show('normal');
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
}


Kontroler akcija:

Code:

 public ActionResult UserRegistration(UserRegistrationViewModel model)
{          if(sve Ok)
                 return PartialView("_NekiView");
             else (nesto ne valja)  
                  return PartialView("_UserRegistration", model);
}


Jel postoji nacin da se uz view vrati jos nesto? Kako se Json uklapa ovde kad treba akcija da vrati html? Slab sam sa Jsonon skroz.

Hvala
[ Toxter @ 02.03.2012. 12:31 ] @
Da, ovo je idealan kandidat za JSon.
Vratis iz akcije Json koji sadrzi recimo 3 stvari
-success (bool flag)
-successHtml
-errorMessage

i onda sa kontrolera vratis JSon:
Code:
public ActionResult UserRegistration(UserRegistrationViewModel model)
{
string partialContent = String.Empty;
          if(sve Ok)
                 partialContent= RenderPartialViewContent("_NekiView");
             

    return JSon(new {success=isOk, successHtml=partialContent, errorMessage=GetErrorMessageForUserRegistrationFailed();});
}
[ tdusko @ 02.03.2012. 13:36 ] @
Hvala Toxter, to je to!

Samo da dodam sta sam jos morao da dodam da bi ovo radilo. Nekome ko ne zna kao i ja ce dobro doci :)

metoda za view-to-string
Code:

 public static string RenderPartialViewContent(string viewName, object model, 
ControllerContext context, ViewDataDictionary viewData, TempDataDictionary tempData)
        {
            viewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
                ViewContext viewContext = new ViewContext(context, viewResult.View, viewData, tempData, sw);
                viewResult.View.Render(viewContext, sw);

                return sw.GetStringBuilder().ToString();
            }
        }


javascript funkcija koja sada dobija Json kao rezultat

Code:

function postRegistrationForm() {
    $('#divContent').hide('slow');
    $.ajax(
    {
        type: "POST",
        url: "/Account/UserRegistration",
        data: $("#frmUserRegistraiton").serialize(),
        success: function (result) {
if(result.success == isOk)
//radi nesto
else
//radi nesto drugo
            $("#divContent").html(result.successHtml);
            $('#divContent').show('normal');
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
}