none
System.NullReferenceException en proyecto MVC RRS feed

  • Pregunta

  • Buena noche, vengo a pedirles ayuda sobre un proyecto que estoy realizando, tengo una lista de archivos listadas, pero a la hora de abrir detalles me sale error de Null Reference:

    @model ArchivoInterfaz2.Models.documentos
    
    @{
        ViewBag.Title = "Details";
    }
    
    <h2>Details</h2>
    
    <div>
        <h4>documentos</h4>
        <hr />
        <dl class="dl-horizontal">
            <dt>
                @Html.DisplayNameFor(model => model.Iddocumento)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.Iddocumento)
            </dd>
    
            <dt>
                @Html.DisplayNameFor(model => model.tipoDoc)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.tipoDoc)
            </dd>
    
            <dt>
                @Html.DisplayNameFor(model => model.descDoc)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.descDoc)
            </dd>
    
            <dt>
                @Html.DisplayNameFor(model => model.codCaja)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.codCaja)
            </dd>
    
            <dt>
                @Html.DisplayNameFor(model => model.estadoDoc)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.estadoDoc)
            </dd>
    
            <dt>
                @Html.DisplayNameFor(model => model.dispDoc)
            </dt>
    
            <dd>
                @Html.DisplayFor(model => model.dispDoc)
            </dd>
    
        </dl>
    </div>
    <p>
        @Html.ActionLink("Edit", "Edit", new { id = Model.Iddocumento }) | //Aquí surge el error
        @Html.ActionLink("Back to List", "Index")
    </p>

    Agradezco mucho su ayuda

    miércoles, 30 de septiembre de 2020 0:48

Respuestas

  • Desde esta vista llamo a Details:

    No. Desde una vista no llamas a la otra vista. Desde la vista, a donde llamas es a un método de acción en el controlador. Y después, ese método de acción es el que llama a la otra vista.

    Cuando haces esto en la vista:

    @Html.ActionLink("Detalles", "Details", new { id=item.Iddocumento }) |

    eso lo que hace es llamar al método de acción "Details" dentro del mismo controlador en el que se encuentra la vista actual, y le pasa el Iddocumento dentro del parámetro Id.

    Ahora lo que te hace falta es revisar ese método y ver qué es lo que hace con ese Id. Lo que debería hacer es usarlo para recuperar el modelo desde la base de datos, y a continuación pasarle ese modelo a la vista de detalles. Si has olvidado este paso, y no estás pasando ese modelo, la vista de detalles no puede funcionar.

    miércoles, 30 de septiembre de 2020 21:28

Todas las respuestas

  •  { id = Model.Iddocumento }) | //Aquí surge el error

    Eso indicaría que Model es null.

    Revisa el método de acción desde el que llamas a esa Vista. Pon un punto de ruptura antes del return View y comprueba si es null el modelo que le estás pasando.

    miércoles, 30 de septiembre de 2020 8:53
  • Desde esta vista llamo a Details:

    @model IEnumerable<ArchivoInterfaz2.Models.documentos>
    
    @{
        ViewBag.Title = "DocsList";
    }
    
    <h2>List</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.tipoDoc)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.descDoc)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.codCaja)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.estadoDoc)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.dispDoc)
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.tipoDoc)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.descDoc)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.codCaja)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.estadoDoc)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.dispDoc)
            </td>
            <td>
                @Html.ActionLink("Editar", "Edit", new { id = item.Iddocumento }) |
                @Html.ActionLink("Detalles", "Details", new { id=item.Iddocumento }) |
                @Html.ActionLink("Borrar", "Delete", new { id = item.Iddocumento })
            </td>
        </tr>
    }
    
    </table>
    

    Pero no sé por qué no me envía el Iddocumento para ver los detalles.

    miércoles, 30 de septiembre de 2020 20:59
  • Desde esta vista llamo a Details:

    No. Desde una vista no llamas a la otra vista. Desde la vista, a donde llamas es a un método de acción en el controlador. Y después, ese método de acción es el que llama a la otra vista.

    Cuando haces esto en la vista:

    @Html.ActionLink("Detalles", "Details", new { id=item.Iddocumento }) |

    eso lo que hace es llamar al método de acción "Details" dentro del mismo controlador en el que se encuentra la vista actual, y le pasa el Iddocumento dentro del parámetro Id.

    Ahora lo que te hace falta es revisar ese método y ver qué es lo que hace con ese Id. Lo que debería hacer es usarlo para recuperar el modelo desde la base de datos, y a continuación pasarle ese modelo a la vista de detalles. Si has olvidado este paso, y no estás pasando ese modelo, la vista de detalles no puede funcionar.

    miércoles, 30 de septiembre de 2020 21:28
  • Entonces si quisiera llamar bien esos datos, que implementaría en la acción del controlador
    // GET: Documentos/Details/5
            public ActionResult Details(int id, documentos documento)
            {
                try
                {
                    using (BD_ArchivoEntities bd1 = new BD_ArchivoEntities())
                    {
                        string consulta1 = "select tipoDoc from documentos where id = " + id + ";";
                        bd1.Database.ExecuteSqlCommand(consulta1);
                        documentos doc = new documentos();
    
                        int _iddoc = id;
                        string _tipDoc = documento.tipoDoc;
                        string _descDoc = documento.descDoc;
                        int _codcaja = documento.codCaja;
                        string _estadoDoc = documento.estadoDoc;
                        string _dispDoc = documento.dispDoc;
    
                        doc.Iddocumento = _iddoc;
                        doc.tipoDoc = _tipDoc;
                        doc.descDoc = _descDoc;
                        doc.codCaja = _codcaja;
                        doc.estadoDoc = _estadoDoc;
    
                        bd1.documentos.ToArray();
                        //bd1.SaveChanges();
    
                    }
    
                    return View("Details");
                }
                catch (Exception e)
                {
                    var ExceptionMessage = string.Concat("El error es ", e);
                    return View("Error");
                }
            }
    Esto es lo que llevo, si puedo resolver eso, me ayudaría de paso con otra situación de borrado, que ingresa a la vista Delete, pero no me muestra qué es lo que voy a eliminar
    miércoles, 30 de septiembre de 2020 23:20
  • Entonces si quisiera llamar bien esos datos, que implementaría en la acción del controlador

    Tienes que corregir esta línea:

    return View("Details");

    No es necesario indicar "Details" (el nombre de la vista) porque por defecto se toma el mismo nombre del método, que ya es Details. En cambio lo que te falta hacer es pasarle el modelo a la vista.

    En resumidas cuentas, suponiendo que el "doc" sea correcto, coincida con el modelo de la vista, y tenga cargados los datos adecuados, lo que tienes que poner es esto:

    return View(doc);

    jueves, 1 de octubre de 2020 7:23
  • Hola Mateo Álvarez Henao

    Alguna novedad con tu consulta?

    Saludos

    viernes, 2 de octubre de 2020 15:23
    Moderador