Использование @ Html.HiddenFor в MVC3 - PullRequest
1 голос
/ 08 декабря 2011

У меня много проблем. Я думаю, что MVC просто ненавидит меня.

первый. Я использую Linq, и модель генерируется автоматически. Я только что добавил нужные мне свойства с помощью тега / директивы [Required].

второй. У меня есть «Большая модель», которая объединяет две модели. Как объясняется здесь -> Несколько моделей в представлении


Когда я пытаюсь отправить обратно представление с моделью, имеющей такие свойства, как нули, is ModelState.isvalid == false. Я думаю, это очевидно, потому что я установил [Обязательный] для некоторых свойств, которые нужны модели. И вот приходит то, что привело меня сюда.

третий. Когда я пытаюсь использовать @ Html.HiddenFor (...), моя страница не отправляется обратно. Если я использую, скажем, 3 HiddenFor, страница выполняет PostBack, но если я использую 10 HiddenFor, страница просто остановится. Это никуда не денется.

Я пытался сделать все, что в моих пределах знаний (очень ограниченно, я действительно новичок в MVC).

  • Я пытался отобразить эти свойства и отобразить их, как если бы это был «Подробный вид». Не удалось.
  • Я пытался установить @HiddenFor (model => model.Client). В действии передается как ноль.
  • Я пытался использовать эти тонны HiddenFor.
  • Я пытался передать только идентификатор в скрытый (ClientID) и извлечь объект из базы данных, но ModelState не будет «обновлять» свой статус один раз внутри действия.

Почему я это делаю? Я делаю это, потому что мне нужно, чтобы на страницах отображалось «Обязательное поле сообщения», когда поле не заполнено, следовательно, запрещается отправка страницы без данных. Моя база данных в порядке, и эти поля имеют значение «Не ноль», поэтому я могу просто удалить [Обязательный] из свойств, но я потеряю «Обязательное поле сообщения» (в дополнение к PostBack, который я пытаюсь избежать).

Если у кого-то есть ответ или ответ, или что-то еще, пожалуйста, опубликуйте его ... Я собираюсь высечь голову xD

Заранее спасибо ...

PS: Извините за мой английский ... Я знаю, что это не хорошо (или даже регулярно).


View

@model PruebaMVC.Models.OperacionModel

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

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Operación de Venta</legend>

        @Html.HiddenFor(model => model.INMUEBLE)
        @*@Html.HiddenFor(model => model.INMUEBLE.Direccion)*@
        @*@Html.HiddenFor(model => model.INMUEBLE.Localidad)*@
        @*@Html.HiddenFor(model => model.INMUEBLE.Ciudad)*@
        @*@Html.HiddenFor(model => model.INMUEBLE.Caracteristicas)*@
        @*@Html.HiddenFor(model => model.INMUEBLE.PrecioVenta)*@
        @*@Html.HiddenFor(model => model.INMUEBLE.CLIENTE.IDCliente)*@

        <div class="editor-label">
            @Html.LabelFor(model => model.OPERACION.CLIENTE1.Nombre, "Nombre del Comprador")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OPERACION.CLIENTE1.Nombre)
            @Html.ValidationMessageFor(model => model.OPERACION.CLIENTE1.Nombre)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.OPERACION.CLIENTE1.Apellido, "Apellido del Comprador")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OPERACION.CLIENTE1.Apellido)
            @Html.ValidationMessageFor(model => model.OPERACION.CLIENTE1.Apellido)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.OPERACION.CLIENTE1.FechaNacimiento, "Fecha de Nacimiento del Comprador")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OPERACION.CLIENTE1.FechaNacimiento)
            @Html.ValidationMessageFor(model => model.OPERACION.CLIENTE1.FechaNacimiento)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.OPERACION.CLIENTE1.DNI, "DNI del Comprador")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OPERACION.CLIENTE1.DNI)
            @Html.ValidationMessageFor(model => model.OPERACION.CLIENTE1.DNI)
        </div>

        <div class="editor-label">
            @*@Html.LabelFor(model=>model.OPERACION.IDFormaPago, "Forma de Pago")*@
            <label for="ComboFP">Forma de Pago</label>
        </div>
        <div class="editor-field">

            <select id="ComboFP" name="SelectFP">
                @{
                    foreach (PruebaMVC.Models.DatosLINQ.FORMA_PAGO item in PruebaMVC.Models.DatosLINQ.OperacionDatos.ListarFormaPago())
                    {
                        <option value="@(item.IDFormaDePago)">@(item.TipoPago)</option>
                    }
                 }
            </select>
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.OPERACION.Comision, "Comisión de la Venta")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OPERACION.Comision)
            @Html.ValidationMessageFor(model => model.OPERACION.Comision)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.OPERACION.Legajo, "Número de Legajo")
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.OPERACION.Legajo)
            @Html.ValidationMessageFor(model => model.OPERACION.Legajo)
        </div>

        <p>
            <input type="submit" class="formbutton" value="Cargar Venta" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Volver al listado de Inmuebles", "Index")
</div>

Контроллер

//
        // GET: /Inmueble/Sale/5

        public ActionResult VentaP(int id)
        {
            OperacionModel unModeloOperacionCompuesto = new OperacionModel();
            unModeloOperacionCompuesto.INMUEBLE = InmuebleDatos.DetallesInmueble(id);
            return View(unModeloOperacionCompuesto);
        }

        //
        // POST: /Inmueble/Sale/5

        [HttpPost]
        public ActionResult VentaP(OperacionModel model, FormCollection collection)
        {
            try
            {
                // TODO: Add insert logic here

                model.INMUEBLE = InmuebleDatos.DetallesInmueble(model.INMUEBLE.IDInmueble);

                CLIENTE clienteComprador = new CLIENTE();
                clienteComprador.Nombre = model.OPERACION.CLIENTE1.Nombre;
                clienteComprador.Apellido = model.OPERACION.CLIENTE1.Apellido;
                clienteComprador.DNI = model.OPERACION.CLIENTE1.DNI;
                clienteComprador.FechaNacimiento = model.OPERACION.CLIENTE1.FechaNacimiento;

                OPERACION nuevaOperacion = new OPERACION();

                int unIDUsuario = UsuarioDatos.IDUsuario(User.Identity.Name);
                int unIDFormaPago = Convert.ToInt32(collection["SelectFP"]);
                decimal unaComision = model.OPERACION.Comision;
                int unLegajo = model.OPERACION.Legajo;

                if (ModelState.IsValid)
                {
                    nuevaOperacion.INMUEBLE = model.INMUEBLE;
                    nuevaOperacion.FechaOperacion = DateTime.Now;
                    nuevaOperacion.IDUsuario = unIDUsuario;
                    nuevaOperacion.IDFormaPago = unIDFormaPago;
                    nuevaOperacion.INMUEBLE.IDEstado = 2;
                    nuevaOperacion.Monto = model.INMUEBLE.PrecioVenta;
                    nuevaOperacion.Comision = unaComision;
                    nuevaOperacion.Legajo = unLegajo;
                    nuevaOperacion.CLIENTE1 = clienteComprador;
                    nuevaOperacion.CLIENTE = model.INMUEBLE.CLIENTE;

                    OperacionDatos.CrearVenta(nuevaOperacion);

                    return RedirectToAction("Index");
                }
                else
                {
                    //return View(nuevaOperacion);
                    return View(model);
                }
            }
            catch
            {
                return View(model);
            }
        }

Редактировать 2:

Я все еще касаюсь кода, и когда я комментирую строку

@Html.HiddenFor(model => model.INMUEBLE.PrecioVenta)

Если «PrecioVenta» - это десятичное число (18,2), страница отправляет сообщение обратно ... очевидно, что все еще возвращается ModelState.isValid == false, поскольку я оставил это значение.

Что я могу сделать?

Какие типы примитивов для "HiddenFor" будут работать? Или это какой-то компонент .Net Framework, который не может "отобразить" этот тип данных должным образом?

1 Ответ

1 голос
/ 08 декабря 2011

Я думаю, что проблема в проверках на стороне клиента и десятичных дробях. Когда у вас есть десятичное значение, оно отображается как «35,0» в вашей культуре ... но валидатор JavaScript не распознает «,» как десятичную запятую.

Это проблема, с которой я столкнулся, но я нашел сообщение здесь в stackoverflow о модификации валидатора JavaScript.

Здесь вы можете узнать, как исправить валидатор JavaScript для десятичных дробей

...