none
ASP.NET MVC view user control Ajax RRS feed

  • Pergunta

  • Criei varios controles para serem usados por uma página principal. O problema é que o ajax dos controles não são executados.

     

    página principal (pelo controller passo nome dos controles a serem renderizados e dados):

    <%

    if (ViewData["left"] != null) %>

    <% Html.RenderPartial(ViewData[

    "left"].ToString(), ViewData["leftData"]); %>

     

    <!--TopMiddle-->

    <%

    if (ViewData["topMiddle"]!=null) %>

    <% Html.RenderPartial(ViewData[

    "topMiddle"].ToString(), ViewData["topMiddleData"]); %>

     

    <!--Middle-->

    <%

    if (ViewData["middle"] != null) %>

    <% Html.RenderPartial(ViewData[

    "middle"].ToString(), ViewData["middleData"]); %>

     

    <div id=results></div>

     

    <!--Right-->

    <%

    if (ViewData["right"] != null) %>

    <% Html.RenderPartial(ViewData[

    "right"].ToString(), ViewData["rightData"]); %>

     

    Alguem tem alguma ideia melhor para fazer isso?

     

    Obrigado,

    Bruno

     

    sábado, 1 de maio de 2010 20:26

Respostas

  • Vamos la, o que você que é:

    Em um formulario de busca ajax, voce digita alguns dados, e esses dados são manipulados na Ação SearchInput

    Então é retornado uma PartialView que vai ser renderizada na Div results

    A view partial List.ascx faz refenrencia a outra PartialView (CompanyRating) que é encarregada de mostrar as estrelinhas de Rate da Entidade

    O problema amigão é que as Partial View são renderizadas com o Microsoft Ajax do qual não executam codigo JavaScript.

    Sugiro que você procure outro meio de fazer essa funcionalidade.

    Eu ja tive um problema parecido com isso.

    Criei uma partial view com um dropdownlist, e que quando o usuario mudasse o valor selecionado, ele executava algo, minha solução foi cria uma pagina normal sem herdar da Master Page somente com essa funcionalidade.

    Espero ter ajudado, se sim marca como respota :D


    Contato:albertim_brasil@hotmail.com

    domingo, 2 de maio de 2010 02:04
  • Amigo, pode estar acontecendo uma série de coisas, recomendo você trocar as chamadas "RenderPartial" por "RenderAction" (caso você estiver usando asp.net mvc 2, se não estiver, migre ;) ). A diferença é que o RenderPartial não carrega os métodos do controlador ao carregar a página, o RenderAction, sim.

     

    Outra coisa, já tive problemas (não me lembro a ocasião) com o document.ready em partial views. Se tiver alguma chamada dessas, coloque-a na página "pai" onde estão as chamadas RenderPartial.

     

    Por fim, verifique se há erros de javascript na página, isso pode fazer com que o jquery e outros scripts não funcionem corretamente.

    Voce pode fazer isso com o firebug + firefox, ou com o inspetor web do safari ou chrome

    segunda-feira, 3 de maio de 2010 13:07

Todas as Respostas

  • Grande Bruno tudo bom?

     

    Cara, não entendi o seu problema, pelo codigo que você colou ai, vejo so a renderização de partial views.

    Onde está o Ajax ai?


    sábado, 1 de maio de 2010 23:45
  •  

    O Ajax está nessas views, cada uma delas é um controle "view user control" com algum script, este por exemplo esse controle faz uma pesquisa, trazendo  o controle com resultados:

     

    <%

    @ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

    <%

    using (Ajax.BeginForm("SearchInput", "Search", new AjaxOptions {UpdateTargetId="results" }))

    {%>

     

    <p>

     

    <label for="Nome">Busco Por:</label>

    <%

    = Html.TextBox("name")%>

    <%

    = Html.ValidationMessage("Nome", "*")%>

     

    </p>

     

    <p>

     

    <label for="Onde">Onde:</label>

    <%

    = Html.TextArea("city")%>

    <%

    = Html.ValidationMessage("Cidade", "*")%>

     

    </p>

     

    <p>

     

    <input type="submit" value="Procurar" />

     

    </p>

    <%} %>

     

     

    <script type="text/javascript" language="javascript">

    $(document).ready(

    function() {

    $(

    "#searchForm").submit(function() {

    $(

    "#searchForm").ajaxSubmit({ target: '#results', beforeSubmit: PreSub, success: Success });

     

    return false;

    });

    });

     

    function Success(responseText, statusText) {

    $(

    "#loadingMessage").html("done");

     

    //$('#resultsTable').tablesorter();

    $(

    "#results").slideDown("slow");

    }

     

    function PreSub(formData, jqForm, options) {

    $(

    "#loadingMessage").html("loading...").fadeIn();

    $(

    "#results").slideUp("fast");

     

    return true;

    }

     

    </script><div id=loadingMessage></div>

     

     //Controller ////////////////////////////////////////////////////////////////////////////////////////////

     

    public ActionResult SearchInput(int? id,string name, string city)

    {

    ......

     

    return PartialView("list.ascx", ViewData["middleData"]);

    }

     

    //List.ascx /////////////////////////////////////////////////////////////////////////////

    <%

    foreach (var item in Model) { %>

     

    <table border=0 width=300>

     

    <tr>

     

    <td colspan="10" align="left">

    <% Html.RenderPartial(

    "~/Areas/Site/Views/Shared/CompanyRating.ascx", Rating.GetCompanyRating(item.company_rating,item.ID) , new ViewDataDictionary()); %>

     

    </td>

     

    //////////////////////////////////////////////////////////////////////////

     

    O problema acontece quando o controle CompanyRating.ascx é renderizado, o script desse controle não funciona (em outras páginas funciona, acho que por ter sido chamado em um ajax?):

     

    <%

    @ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ContentManager.Models.company_rating>" %>

    <%

    @ Import Namespace="ContentManager.Util" %>

    <

     

    script type="text/javascript">

    $(

    function() {

    $(

    '#Form<%=Model.ID %> :radio.star').rating('readOnly', true);

    $(

    '#rater<%=Model.ID %>').hide();

    $(

    '#rated<%=Model.ID %>').mouseover(function() {

    $(

    '#rated<%=Model.ID %>').hide();

    $(

    '#rater<%=Model.ID %>').show();

    });

    $(

    '#rate<%=Model.ID %> :radio.auto-submit-star').rating({

    callback:

    function(value, link) {

    $.ajax({

    type:

    "POST",

    url:

    "../../Site/Company/Rate",

    data: $(

    "#rate<%=Model.ID %>").serialize(),

    dataType:

    "text/plain",

    success:

    function(response) {

     

    if (response != 'false') {

     

    var data = eval('(' + response + ')');

    alert(

    'Sua nota foi registrada');

    $(

    '#currentlyrated<%=Model.ID %>').html('Avaliada ' + data.AverageRating.toFixed(2) +

     

    ' por ' + data.TotalRaters + ' pessoas');

    }

    else {

    alert(

    'Voc j avaliou esta empresa!');

    }

    $(

    '#rater<%=Model.ID %>').hide();

    $(

    '#rated<%=Model.ID %>').show();

    },

    error:

    function(response) {

    alert(

    'Houve um erro.');

    }

    });

    }

    });

    });

    </

     

    script>

     

     

     

    domingo, 2 de maio de 2010 00:35
  • Vamos la, o que você que é:

    Em um formulario de busca ajax, voce digita alguns dados, e esses dados são manipulados na Ação SearchInput

    Então é retornado uma PartialView que vai ser renderizada na Div results

    A view partial List.ascx faz refenrencia a outra PartialView (CompanyRating) que é encarregada de mostrar as estrelinhas de Rate da Entidade

    O problema amigão é que as Partial View são renderizadas com o Microsoft Ajax do qual não executam codigo JavaScript.

    Sugiro que você procure outro meio de fazer essa funcionalidade.

    Eu ja tive um problema parecido com isso.

    Criei uma partial view com um dropdownlist, e que quando o usuario mudasse o valor selecionado, ele executava algo, minha solução foi cria uma pagina normal sem herdar da Master Page somente com essa funcionalidade.

    Espero ter ajudado, se sim marca como respota :D


    Contato:albertim_brasil@hotmail.com

    domingo, 2 de maio de 2010 02:04
  • Amigo, pode estar acontecendo uma série de coisas, recomendo você trocar as chamadas "RenderPartial" por "RenderAction" (caso você estiver usando asp.net mvc 2, se não estiver, migre ;) ). A diferença é que o RenderPartial não carrega os métodos do controlador ao carregar a página, o RenderAction, sim.

     

    Outra coisa, já tive problemas (não me lembro a ocasião) com o document.ready em partial views. Se tiver alguma chamada dessas, coloque-a na página "pai" onde estão as chamadas RenderPartial.

     

    Por fim, verifique se há erros de javascript na página, isso pode fazer com que o jquery e outros scripts não funcionem corretamente.

    Voce pode fazer isso com o firebug + firefox, ou com o inspetor web do safari ou chrome

    segunda-feira, 3 de maio de 2010 13:07