El formulario generado primero en la base de datos de EF no se validará

Acabo de crear un nuevo controlador, junto con sus formularios CRUD, etc., con un modelo/entidad EF de base de datos primero.

Está arrojando una serie de errores de validación al guardar, pero dado que el formulario tiene validadores, no veo por qué sería así.

Por razones que están más allá de mí, no obtengo ninguna validación en absoluto. Simplemente va directamente a la llamada saveChanges(), que falla rápidamente.

Aquí está el formulario de edición:

    @model StatementsApplication.DAL.StatementTask

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>StatementTask</legend>



        <div class="editor-label">
            @Html.LabelFor(model => model.sInitials)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.sInitials)
            @Html.ValidationMessageFor(model => model.sInitials)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.dtCompleted)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.dtCompleted)
            @Html.ValidationMessageFor(model => model.dtCompleted)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.sGroupLabel)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.sGroupLabel)
            @Html.ValidationMessageFor(model => model.sGroupLabel)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.nGroupSequence)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.nGroupSequence)
            @Html.ValidationMessageFor(model => model.nGroupSequence)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.sTaskType)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.sTaskType)
            @Html.ValidationMessageFor(model => model.sTaskType)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.sTaskLabel)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.sTaskLabel)
            @Html.ValidationMessageFor(model => model.sTaskLabel)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.nTaskSequence)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.nTaskSequence)
            @Html.ValidationMessageFor(model => model.nTaskSequence)
        </div>

        @Html.HiddenFor(model => model.ID)

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

y aquí está el modelo generado:

namespace StatementsApplication.DAL
{
    using System;
    using System.Collections.Generic;

    public partial class StatementTask
    {
        public int StmtBatchID { get; set; }
        public string sInitials { get; set; }
        public Nullable<System.DateTime> dtCompleted { get; set; }
        public string sGroupLabel { get; set; }
        public double nGroupSequence { get; set; }
        public string sTaskType { get; set; }
        public string sTaskLabel { get; set; }
        public double nTaskSequence { get; set; }
        public int ID { get; set; }

        public virtual StatementBatch tblStmtBatch { get; set; }
    }
}

y aquí están los bits del controlador...

//
// GET: /StatementTask/Edit/5

public ActionResult Edit(int id = 0)
{
    StatementTask statementtask = db.StatementTasks.Find(id);
    if (statementtask == null)
    {
        return HttpNotFound();
    }
    ViewBag.StmtBatchID = new SelectList(db.StatementBatches, "ID", "sStatus", statementtask.StmtBatchID);
    return View(statementtask);
}

//
// POST: /StatementTask/Edit/5

[HttpPost]
public ActionResult Edit(StatementTask statementtask)
{
    if (ModelState.IsValid)
    {
        try
        {
            db.Entry(statementtask).State = EntityState.Modified;
            db.SaveChanges();
        }
        catch (Exception ex) {
            throw ex;
        }
        return RedirectToAction("Index");
    }
    ViewBag.StmtBatchID = new SelectList(db.StatementBatches, "ID", "sStatus", statementtask.StmtBatchID);
    return View(statementtask);
}

Es una cuestión de confusión para mí en cuanto a por qué sInitials arroja errores de validación 'requeridos', así como por qué sGroupLabel arroja errores de validación de longitud.

Muchas Gracias

preguntado el 03 de mayo de 12 a las 19:05

2 Respuestas

a) su modelo no tiene anotaciones de validación de datos. Como tal, MVC no realiza ninguna validación, porque no le está diciendo qué validar.

b) No mencionas lo que estás enviando. ¿Está enviando un formulario vacío?

contestado el 03 de mayo de 12 a las 19:05

Estoy de acuerdo, no tiene ninguna validación, por lo que es un misterio por qué obtengo errores de validación del envío... sin embargo, para responder a su (b) pregunta, estoy editando una fila con algunos datos completos... .una fila preexistente, con datos generados por otro proceso. - ReidLinden

@reidLinden: hay 2 (o 3) niveles de validación. Hay validación de jquery del lado del cliente, hay validación de MVC del lado del servidor, y luego EF tiene validación en sus atributos de modelo. ¿Está utilizando mapeo fluido en su modelo ef? ¿Le estás diciendo que algunos campos son obligatorios? - Erik Funkenbusch

Soy bastante inexperto cuando se trata de cosas de asp.net/mvc... así que ni siquiera puedo decir que mi falta de conocimiento de términos como Fluent significa que no lo soy... podría serlo. Todo lo que sé es que he generado mi capa EF a partir de una base de datos existente. Encontré el error con la longitud máxima. Actualicé la tabla, pero olvidé volver a ejecutar la actualización del modelo... pero todavía me quejo de las iniciales... mi única idea es que de alguna manera, porque la columna tiene una restricción NOT NULL (con un valor predeterminado '' valor), cuando el campo vacío regresa al servidor, o la capa de validación de EF que mencionó ... el vacío se cuenta como nulo. - ReidLinden

mi conjetura parece ser correcta. sInitials entra en la Vista de edición como "" (una cadena vacía), pero vuelve a publicar el guardado como un valor nulo. ¿Hay una mejor manera de manejar esto que simplemente detectar el caso y restablecer a ""? Eso parece bastante frágil, así que anticipo que hay un truco inteligente para que funcione. - ReidLinden

@reidLinden: el "truco inteligente" es que debe hacer que el valor sea anulable en la base de datos si va a pasar valores nulos. Usar cadenas vacías es solo buscar problemas. - Erik Funkenbusch

parece que las anotaciones de datos resolverán este problema

   [Required(AllowEmptyStrings = true)]
   [DisplayFormat(ConvertEmptyStringToNull = false)]
   public object Note { get; set; }

vía http://fendy-huang.blogspot.com/2011/04/how-to-pass-empty-string-in-entity.html

contestado el 03 de mayo de 12 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.