Моя проблема в том, что мое свойство 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), обратите внимание на удаленную проверку свойства Login:
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">×</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);
}
}
Я устанавливаю точку останова в этом действии, и оно срабатывает, но логин имеет значение null. Я проверил с помощью отладчика Google Chrome заголовок HTTP-запроса, и он показывает, что форма отправляется следующим образом: Usuario.Login: asdasdasd.
Вопрос простой, как я могу заставить его привязываться?
Кстати, я использую MVC5.
Спасибо.