2011-01-20 12 views
30

He estado utilizando el nuevo ASP.Net MVC 3 RemoteAttribute para enviar una llamada remota a un método de acción que tenía un solo parámetro. Ahora quiero pasar en un segundo parámetro utilizando la propiedad AdditionalFields:Validación remota en ASP.Net MVC 3: cómo usar AdditionalFields en acción Método

[Remote("IsEmailAvailable", "Users", AdditionalFields = "InitialEmail")] 

Dónde IntialEmail es un campo oculto en la vista. La acción se ve de esta manera:

public JsonResult IsEmailAvailable(
      string email, 
      string InitialEmail) 
{ 
//etc. 
} 

Cuando se representa la vista, el campo oculto está poblada, pero cuando el método de acción se desencadena de forma remota, el valor es una cadena vacía.

He visto en otras partes la sensibilidad de mayúsculas/minúsculas puede ser un problema, así que me he asegurado de que el método de Acción tenga el mismo caso para ambos parámetros.

¿Alguna otra sugerencia? Este AdditionalFields solía llamarse Fields.

Gracias,

Beaudetious

+0

¿Se puede agregar el marcado de su vista? El campo adicional necesita coincidir con uno de los campos en su vista. ¿Obtiene un valor para el correo electrónico pero una cadena vacía para InitialEmail? Para investigarlo, es útil depurar con Firebug y puede ver la solicitud que se envía de vuelta al servidor. Debería tener una cadena de consulta para los campos que su acción está esperando. Algo como? Email = blah? InitialEmail = blah ... –

+0

La respuesta a otra de mis preguntas resolvió esta también: http://stackoverflow.com/questions/4696276/client-side-validation-not-firing-for -compareattribute-dataannotation Entonces, ¿cómo debería marcar esta pregunta? – beaudetious

Respuesta

59

extraño. Funciona para mí:

Modelo:

public class MyViewModel 
{ 
    [Required] 
    [Remote("IsEmailAvailable", "Home", AdditionalFields = "InitialEmail")] 
    public string Email { get; set; } 
} 

controlador:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 

    public ActionResult IsEmailAvailable(string email, string initialEmail) 
    { 
     return Json(false, JsonRequestBehavior.AllowGet); 
    } 
} 

Vista:

@model AppName.Models.MyViewModel 
@{ 
    ViewBag.Title = "Home Page"; 
} 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 
@using (Html.BeginForm()) 
{ 
    @Html.TextBoxFor(x => x.Email) 
    @Html.ValidationMessageFor(x => x.Email) 
    <input type="hidden" name="InitialEmail" value="[email protected]" /> 
    <input type="submit" value="OK" /> 
} 

IIRC hubo algún error en ASP.NET MVC 3 RC2 con este validación remota que se corrigió en el RTM.

+6

Darin: Usted y su "me funciona" van a ser mi muerte algún día. ;) – beaudetious

+0

En serio, imprima el valor de InitialEmail en el método IsEmailAvailable en la ventana de Salida. Verás que está en blanco. Puedo disparar el método remoto, pero el parámetro adicional no tiene valor. – beaudetious

+0

@beaudetious, lo hice y no estaba en blanco. También miré con FireBug a la solicitud que se envió. Pude ver el valor también :-) Espera, te enviaré mi proyecto de muestra. Solo para terminar mi cerveza. –

2

Su campo oculto debe estar dentro del mismo formulario que el campo que está validando (como en el ejemplo de Darin); de lo contrario, el valor del campo oculto no se enviará como parámetro al método de acción de validación "public ActionResult IsEmailAvailable (string correo electrónico, string initialEmail) "

-1

función IsEmailAvailable (cadena de correo electrónico, cadena initialEmail) param correo electrónico debe enviar un correo electrónico exactamente igual que el correo electrónico de la propiedad.

+0

El caso no importa. El marco MVC lo mapea insensible a mayúsculas y minúsculas. – Fred

Cuestiones relacionadas