ASP.NET - Problemas con Url.Action

 
Vista:
Imágen de perfil de JJRM1996
Val: 28
Ha aumentado su posición en 3 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Problemas con Url.Action

Publicado por JJRM1996 (13 intervenciones) el 17/02/2021 17:19:48
Buenos días/tardes/noches,
Tengo un controlador con varios métodos, cada uno de ellos con un tipo de HTTP, o es Get o Post.
Entonces quiero llamar a uno de los métodos Post desde una vista. El Url.Action lo implemento mediante esta forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string FFormarBotonDescarga(string pAlineado, object pDocId, object pDocNum, object pConfirmacion)
    {
        string res = "";
 
        try
        {
            res = Url.Action("solicitar", "main", new { DocId = pDocId, DocNum = pDocNum });
        }
        catch (Exception ex) {
            throw ex;
        }
 
        return "<td></td><td class='" + pAlineado + "'><a href ='" + res + "' class='btn btn-link p-none'>Descargar</a></td>";
    }

El método solicitar no lo encuentra. Me devuelve un 404. Al cambiar el método por otro ya existente por ejemplo: descargar_async si funciona, lo localiza sin problema. Pero el caso es que tengo que hacer uso del método solicitar. El método Solicitar hace uso de diferentes métodos para generar un PDF
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 165
Oro
Ha mantenido su posición en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Problemas con Url.Action

Publicado por Miguel (72 intervenciones) el 17/02/2021 17:31:48
pues es mejor si tu metodo es privado nunca lo encontrara tambien como estas enviando los parametros,
por lo regular es un post y tu metodo deberia ser de la siguiente forma

[HttpPost]
public string FFormarBotonDescarga(string pAlineado, object pDocId, object pDocNum, object pConfirmacion)
{
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JJRM1996
Val: 28
Ha aumentado su posición en 3 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Problemas con Url.Action

Publicado por JJRM1996 (13 intervenciones) el 17/02/2021 17:44:35
Entiendo perfectamente lo que me comentas. Quizas deberías haber informado más de la situación, soy nuevo en este MVC de C#. Estoy en una Vista con sintaxis Razor. En la misma vista lo que se hacía directamente en anteriormente era esto:

1
2
3
4
5
6
<a href="Url.Action("solicitar", "main", new { DocId = Model.Maestros.Rows[i]["DocId"], DocNum = Model.Maestros.Rows[i]["DocNum"] } )"
      target="_blank"
     data-requiere-confirmacion="(Model.Maestros.Rows[i]["RequiereConfirmacion"])"
      class="btn-descargar">
      Descargar
</a>

Para hacerlo un poco mas entendible en código c# lo puse todo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
@model amedida.BL.Item.ItemInformeDatos
@using System.Data;
@{
    Layout = "~/Views/Shared/_LayoutPartial.cshtml";
 
    string FAlineado(string pAlineado)
    {
        switch (pAlineado)
        {
            case "I":
                return "text-left";
            case "D":
                return "text-right";
            default:
                return "text-center";
        }
    }
 
    string FTipoDato(string pTipoDato, string pAlineadoTd, string pResultado, string pMascara)
    {
        string pTd = "<td class='" + pAlineadoTd + "'>";
        switch (pTipoDato)
        {
            case "TXT":
                pTd += pResultado;
                break;
            case "FEC":
                pTd += Convert.ToDateTime(pResultado).ToString(pMascara);
                break;
            case "INT":
                pTd += Convert.ToInt64(pResultado).ToString(pMascara);
                break;
            case "DEC":
                pTd += Convert.ToDecimal(pResultado).ToString(pMascara);
                break;
            case "DIV":
                pTd += Convert.ToDecimal(pResultado).ToString(pMascara);
                break;
            case "BOL":
                pTd += Convert.ToBoolean(pResultado);
                break;
            case "LINK":
                pTd += "Descargar un enlace";
                break;
 
        }
        return pTd += "</td>";
    }
 
    string FFormarBotonDescarga(string pAlineado, object pDocId, object pDocNum, object pConfirmacion)
    {
        string res = "";
 
        try
        {
            res = Url.Action("solicitar", "main", new { DocId = pDocId, DocNum = pDocNum });
        }
        catch (Exception ex) {
            throw ex;
        }
 
        return "<td></td><td class='" + pAlineado + "'><a data-requiere-confirmacion='" + pConfirmacion + "' href ='" + res + "'>Descargar</a></td>";
    }
 
    string FFormarCuerpoTabla(amedida.BL.Item.ItemInformeDatosColumna pListaColumnas, string pAlineado, object pResultadoBusqueda)
    {
 
        string Output = null;
        if (pListaColumnas.Nombre.Equals("IdPadre"))
            Output += "<td class='" + pAlineado + "'><button class='btn btn-link p-none data-toggle='modal' data-target='#modal-" + pResultadoBusqueda + "'><i class='fa fa-search'></i></button></td>";
        else
            Output += FTipoDato(pListaColumnas.TipoDeDatos, pAlineado, pResultadoBusqueda.ToString(), pListaColumnas.Formato);
        return Output;
    }
 
    HtmlString FConstruirCabeceraTabla(List<amedida.BL.Item.ItemInformeDatosColumna> pColumnas)
    {
        string Output = "<thead><tr>";
        foreach (amedida.BL.Item.ItemInformeDatosColumna columnas in pColumnas)
        {
            if(!columnas.Nombre.Equals("DocId"))
                Output += ("<th class='"+FAlineado(columnas.Alineado)+"'>" + columnas.Titulo + "</th>");
            else
                Output += ("<th></th>");
        }
        Output += "</tr></thead>";
        return new HtmlString(Output);
    }
 
    HtmlString FConstruirCuerpoTabla(List<amedida.BL.Item.ItemInformeDatosColumna> pColumnas, DataTable pMaestros)
    {
        string res = "<tbody>";
        foreach (DataRow fila in pMaestros.Rows)
        {
            res += "<tr>";
            foreach (amedida.BL.Item.ItemInformeDatosColumna columna in pColumnas)
                if (!columna.Nombre.Equals("DocId") && !columna.Nombre.Equals("DocNum"))
                    res += FFormarCuerpoTabla(columna, FAlineado(columna.Alineado), fila[columna.Nombre]);
                else
                    res += FFormarBotonDescarga(FAlineado(columna.Alineado), fila["DocId"], fila["DocNum"], fila["RequiereConfirmacion"]);
            res += "</tr>";
        }
        res += "</tbody>";
        return new HtmlString(res);
    }
}
@if (!string.IsNullOrEmpty(this.ViewBag.Error))
{
<div class="row">
    <div class="col-xs-12">
        <div class="alert alert-danger">
            <i class="fa fa-warning"></i>
            @this.ViewBag.Error
        </div>
    </div>
</div>
}
else if (this.Model != null)
{
<div class="row">
    <div class="col-xs-12">
        <section class="panel panel-primary">
            <header class="panel-heading">
                <div class="panel-actions">
                    <a href="#" class="botonCSV">
                        <img src="~/Images/csv.png" alt="Imagen excell/csv" width="28" height="28"/>
                        <i class="fa fa-caret-down"/>
                    </a>
                </div>
                <h2 class="panel-title">Resultados</h2>
            </header>
            <section class="panel-body">
                <div class="table-responsive">
                    <table class="table">
                        @FConstruirCabeceraTabla(Model.Columnas)
                        @FConstruirCuerpoTabla(Model.Columnas, Model.Maestros)
                    </table>
                </div>
            </section>
        </section>
    </div>
</div>
}
Perdona por la larga extensión de código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan José
Val: 28
Ha aumentado su posición en 3 puestos en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Problemas con Url.Action

Publicado por Juan José (13 intervenciones) el 22/02/2021 17:04:26
Descubierto el error, la funcion a la que llamaba no era la correcta. La funcion correcta es la que se mencionó en el primer momento: descargar_async
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar