none
Dificuldade habilitar campos para mesma Action ser de Inclusao, Alteracao, Exclusao e Visualizacao RRS feed

  • Pergunta

  • Boa tarde!

    Não quero em meu sistema, para cada entidade, seja básica ou não, criar uma Action Create, Edit, Delete, ou View.

    Em PHP eu passava no link assim: /cliente/acao/visualizar

    E conforme a ação (Incluir, Alterar, Excluir ou Visualizar) os campos eram habilitados ou não (readonly ou mesmo disabled).

    Como é a melhor forma de fazer isso no ASP.Net MVC?

    Estou fazendo uns testes e vi que no EditorFor eu posso por um new { @readonly="readonly" }.

    Mas tipo conforme a acao eu queria que todos, ou quase todos, componentes respeitassem uma determinada condição. 

    No meu caso VISUALIZAR e EXCLUIR bloqueia tudo.  E alguns campos são habilitados ou não conforme a ação seja de inclusão ou alteração.

    Não quero ter que por um if para cada campo na view, isso ficará muito ruim em pouco tempo.

    Alguma sugestão?

    segunda-feira, 19 de novembro de 2012 18:41

Respostas

  • Murilo, achei a solução!

    Saca só, no início da view:

    @{
        ViewBag.Title = "TrocarSenha";
        Layout = "~/Views/Shared/_Layout.cshtml";
        
        //object htmlattributes = new { @readonly = "readonly" };
        object htmlattributes = new object();
    }

    E na hora de criar os controles:

    @Html.TextBoxFor(model => model.SenhaAtual, htmlattributes)
    
    @Html.TextBoxFor(model => model.NovaSenha, htmlattributes)

    Funcionou 100%.  Não posso deixar htmlattributes como null pois dá erro, daí só dar um new que ficou correto.  Ou então eu uso a linha de cima de faço o new @readonly e funcionou certinho.   Muito bom.

    segunda-feira, 19 de novembro de 2012 23:00

Todas as Respostas

  • Para fazer como no php você precisaria criar uma rota:

    routes.MapRoute(
        name: "acao",
        url: "{controller}/{action}/acao/{acao}",
        defaults: new { acao = UrlParameter.Optional}
    );

    e colocar um parametro na sua action:

    public ActionResult Teste(string acao)
    {
         return View("Index");
    }


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 19 de novembro de 2012 19:29
  • Bom vai ficar muito bom assim, mas e quanto a view?  Por exemplo se terei uma única view, para mexer em algum lugar apenas, como vou definir no TextBoxFor, ou EditFor, se é para habilitar ou nao?

    Por exemplo quando eu fizer um:

    @Html.TextBoxFor(model => model.NovaSenha, new { @disabled = "" })

    O textbox entra disabled ou read only mesmo nao especificando valor.

    @Html.TextBoxFor(model => model.NovaSenha})

    Daí será que vou ter que fazer um IF para cada componente?

    Tipo:

    @if (ViewBag.Acao == "VISUALIZAR" || ViewBag.Acao == "EXCLUIR")
        {
            @Habilitar = false;
        }
        else
        {
            @Habilitar = true;
        }
            
        @if (Habilitar)
        {
            @Html.TextBoxFor(model => model.NovaSenha)
        }
        else
        {
            @Html.TextBoxFor(model => model.NovaSenha, new { @readonly = "" })
        }

    Mesmo que eu passe o @readonly como false eu não quero fazer um IF para cada componente.

    Alguma solução?  Estou tentando mas não estou conseguindo.   Quero pegar a ção, definir o status dos componentes e nas chamadas do Razor ser uma só independente.

    Deu pra entender?

    Obrigado

    segunda-feira, 19 de novembro de 2012 22:47
  • Ai não sei cara, acho que tem que ser no if mesmo.

    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 19 de novembro de 2012 22:49
  • Putz... não queria fazer as views separadas conforme mandam 100% dos tutoriais pq senão terei uma duplicação imensa nas views... bom.. vou dar uma pesquisada de novo.. se achar algo eu posto aqui.
    segunda-feira, 19 de novembro de 2012 22:55
  • Murilo, achei a solução!

    Saca só, no início da view:

    @{
        ViewBag.Title = "TrocarSenha";
        Layout = "~/Views/Shared/_Layout.cshtml";
        
        //object htmlattributes = new { @readonly = "readonly" };
        object htmlattributes = new object();
    }

    E na hora de criar os controles:

    @Html.TextBoxFor(model => model.SenhaAtual, htmlattributes)
    
    @Html.TextBoxFor(model => model.NovaSenha, htmlattributes)

    Funcionou 100%.  Não posso deixar htmlattributes como null pois dá erro, daí só dar um new que ficou correto.  Ou então eu uso a linha de cima de faço o new @readonly e funcionou certinho.   Muito bom.

    segunda-feira, 19 de novembro de 2012 23:00
  • Show cara :)

    Só que tem cuidar na hora do Post agora pra verificar quais campos ele poderia mexer.


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    segunda-feira, 19 de novembro de 2012 23:01