【问题标题】:ViewModel property doesn't bind into controller action parameterViewModel 属性未绑定到控制器操作参数
【发布时间】:2013-12-18 06:19:41
【问题描述】:

我的问题是我的 ViewModel 属性没有绑定到动作参数中。 我想如果我给你我的代码会更清楚。

我有一个模型如下:

namespace Sima3.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Usuario
    {
        public string Login { get; set; }
        public string NombreCompleto { get; set; }
        public short Organigrama { get; set; }
        public int Interno { get; set; }
        public string EMail { get; set; }
    }
}

我在另一个文件中为这个部分类添加了DataAnnotations(因为这个模型是由EntityFramework自动生成的),注意登录属性上的远程验证

namespace Sima3.Models
{
    [MetadataType(typeof(UsuarioMetaData))]
    public partial class Usuario 
    {
    }
    public class UsuarioMetaData
    {
        [Display(Name = "Nombre de Usuario")]
        [Remote("NoExisteUsuario", "Validation")]
        [Required]
        public string Login { get; set; }
        [Display(Name = "Nombre y Apellido")]
        [Required]
        public string NombreCompleto { get; set; }
        [Display(Name = "Sector")]        
        [Required]
        public short Organigrama { get; set; }
        [Required]
        public int Interno { get; set; }
        [EmailAddress]
        [Required]
        public string EMail { get; set; }
    }
}

现在,我有一个 ViewModel,它包含一个 Usuario 类型的属性和渲染我的视图所需的一些其他内容:

namespace Sima3.ViewModels.PedidoViewModels
{
    public class AgregarViewModel
    {
        public Usuario Usuario { get; set; }
        public Pedido Pedido { get; set; }
        public SelectList ListaSectores { get; set; }
        public SelectList ListaEstados { get; set; }
        public SelectList ListaPrioridades { get; set; }
        public SelectList ListaTipos { get; set; }
        public SelectList ListaDirecciones { get; set; }
    }
}

我的观点如下(我只会发布一部分,如果你需要看更多请告诉我):

@using (Ajax.BeginForm("Crear", "Usuario", null,
                new AjaxOptions
                {
                    OnSuccess = "UsuarioCreadoSuccess",
                    HttpMethod = "Post"
                }
                , new { @class = "form-horizontal", id = "FormUsuario" }))
            {
                @Html.AntiForgeryToken()
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                    <h4 class="modal-title title">Nuevo Usuario</h4>
                </div>
                <div class="modal-body">
                    @Html.ValidationSummary(true)
                    <div class="form-group">
                        @Html.LabelFor(model => model.Usuario.Login, new { @class = "col-lg-4 control-label" })
                        <div class="col-lg-7">
                            @Html.TextBoxFor(model => model.Usuario.Login, new { @class = "form-control"})

                            @Html.ValidationMessageFor(model => model.Usuario.Login)
                        </div>
                    </div>

好吧,重要的部分是 TextBoxFor,它为我呈现下一个 HTML:

<input class="form-control valid" data-val="true" data-val-remote="'Nombre de Usuario' is invalid." data-val-remote-additionalfields="*.Login" data-val-remote-url="/Validation/NoExisteUsuario" data-val-required="El campo Nombre de Usuario es obligatorio." id="Usuario_Login" name="Usuario.Login" type="text" value="">

如您所见,文本框名称为:name="Usuario.Login"

远程验证调用我的控制器操作如下所示:

    public JsonResult NoExisteUsuario([Bind(Prefix="Usuario")]string Login)
    {
        Usuario usuario = db.Usuarios.Find(Login);
        if (usuario != null)
        {
            var MensajeDeError = string.Format("El usuario {0} ya existe", Login);
            return Json(MensajeDeError, JsonRequestBehavior.AllowGet);
        }
        else
        {
            return Json(true, JsonRequestBehavior.AllowGet);
        }
    }

我在此操作中设置了一个断点,它被命中,但登录为空。 我用谷歌浏览器的调试器检查了 http 请求标头,它显示表单正在像这样提交:Usuario.Login: asdasdasd。

问题很简单,怎么绑定?

顺便说一句,我正在使用 MVC5。

谢谢。

【问题讨论】:

    标签: asp.net-mvc bind asp.net-mvc-5 asp.net-mvc-viewmodel remote-validation


    【解决方案1】:

    好吧,我终于让它工作了,看来我错误地设置了前缀绑定属性。 现在我的操作如下所示:

        public JsonResult NoExisteUsuario([Bind(Prefix="Usuario.Login")]string login)
        {
            Usuario usuario = db.Usuarios.Find(login);
            if (usuario != null)
            {
                var MensajeDeError = string.Format("El usuario {0} ya existe", login);
                return Json(MensajeDeError, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2013-06-25
      相关资源
      最近更新 更多