【问题标题】:Using @Html.HiddenFor in MVC3在 MVC3 中使用 @Html.HiddenFor
【发布时间】:2011-12-08 02:50:23
【问题描述】:

我遇到了很多麻烦。 我认为 MVC 只是讨厌我。

第一。我正在使用 Linq,模型是自动生成的。我刚刚使用 [Required] 标签/指令完成了我需要的属性。

第二。我有一个连接两个模型的“大模型”。 就像在这里解释-> Multiple models in a view


当我尝试使用具有空值等属性的模型回发视图时,ModelState.isvalid == false。我认为这很明显,因为我将 [Required] 设置为模型需要的一些属性。 把我带到这里的东西来了。

第三。当我尝试使用 @Html.HiddenFor(...) 我的页面不会回发。 如果我使用 3 HiddenFor,页面执行 PostBack,但如果我使用 10 HiddenFor,页面将静止不动。它不会去任何地方。

我已经尝试做我知识范围内的所有事情(非常有限,我是 MVC 的新手)。

  • 我尝试将这些属性显示在视图中,并像“详细视图”一样显示它们。没有成功。
  • 我尝试设置@HiddenFor(model => model.Client)。在 Action 中作为 null 传递。
  • 我尝试过使用这些大量的 HiddenFor。
  • 我尝试只传递隐藏的 ID (ClientID) 并从数据库中检索对象,但是一旦进入操作,ModelState 就不会“更新”其状态。

我为什么要这样做? 我这样做是因为我需要页面在未填充框时显示“必填字段消息”,因此禁止页面在没有数据的情况下回发。 我的数据库很好,这些字段是“非空”,所以,我可以从属性中删除 [Required],但我会丢失“必填字段消息”(除了 PostBack 那是我'我试图避免)。

如果有人有答案或答案或其他任何东西,请发布它...我要开枪了xD

提前谢谢...

PS:对不起我的英语……我知道它不好(甚至不正常)。


查看

@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 的某些内容无法正确“映射”该数据类型?

【问题讨论】:

  • 您应该发布您的代码、视图和控制器...以便我们为您提供帮助。
  • @Romias 我编辑了我的帖子并添加了代码。我希望你能理解它,因为类和属性的名称是用西班牙语写的。
  • 有点像可以解决它...我只是从 hiddenFor 中拿走了“价格”并且不需要它,所以 ModelState.isValid == true。我喜欢这种尝试卷起袖子来完成肮脏工作的事情,但是当你不知道为什么会发生这些事情时,你会觉得有点愚蠢。你能给我的任何线索都会很棒!
  • 用英语把乌拉圭人写给阿根廷人很有趣 :) 你有我对你的问题的不理解作为答案。
  • 真的很有趣……这就是全球化世界对我们的影响。 Para escribir en nuestro idioma al menos, Muchas Gracias!

标签: asp.net-mvc-3 requiredfieldvalidator modelstate html.hiddenfor


【解决方案1】:

我认为问题在于客户端验证和小数。 当您有一个十进制值时,它会在您的文化中将其呈现为“35,0”...但是 javascript 验证器无法将“,”识别为十进制逗号。

这是我遇到的一个问题,但我在 stackoverflow 中找到了一篇关于修改 javascript 验证器的帖子。

Here you can learn how to fix the javascript validator for decimals

【讨论】:

  • 好吧,我认为你成功了。是的,我在客户端验证中遇到了“逗号”和“点”的问题。我试图按照链接上的说明更正脚本(这是在星期天),但在不显眼的验证中仍然失败。我决定让它这样,并在将来修复它。现在这不是优先事项。
  • 哦,我也修改了网页配置,将“文化”和“uiCulture”设置为自动。也没成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多