c# - tutorial - Se necesita una línea guía para el método de acción MVC con el atributo Bind.
mvc asp.net c# (3)
Cuando se ejecuta esta acción, el archivador modelo MVC utilizará los parámetros de solicitud para poblar las propiedades del parámetro del user
, como ya sabrá. Sin embargo, el atributo Bind
le dice al archivador del modelo que solo rellene las propiedades con los nombres especificados.
Por lo tanto, en este caso solo se rellenarán las propiedades Username
, Username
FullName
y Email
. Todos los demás serán ignorados.
Consulte aquí para obtener más detalles: http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/
Estaba revisando un código de método de acción y vi que se usaba un atributo allí, pero realmente no entendía el uso. aquí está el código
public ActionResult User([Bind(Include = "Username,FullName,Email")]User user)
{
if (!ModelState.IsValid()) return View(user);
try
{
user.save()
// return the view again or redirect the user to another page
}
catch(Exception e)
{
ViewData["Message"] = e.Message;
return View(user)
}
}
([Bind(Include = "Username,FullName,Email")]User user)
simplemente no entiendo la línea anterior Bind include etc
así que ayúdame a comprender este tipo de atributo utilizado y cuando las personas escriben este tipo de código en mvc. será una gran ayuda si alguien me hace entender con un código pequeño de muestra donde usarán este Bind attribute
.
Actualización: Supongamos que tengo un formulario desde donde el usuario puede ingresar solo Nombre, Apellido y Género, entonces mi método de acción se ve como
public ActionResult Edit(string FirstName,string LastName,string Gender)
{
// ...
}
esto funcionará, creo. entonces, ¿por qué debería usar un atributo de vinculación porque mi método de acción anterior funcionará bien?
El atributo Bind es una forma de protegerse contra el exceso de publicación en escenarios de creación. Por ejemplo, suponga que la entidad Estudiante incluye una propiedad Secreta que no desea que configure esta página web.
public class Student
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public string Secret { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
Incluso si no tiene un campo Secreto en la página web, un pirata informático podría usar una herramienta como el violín o escribir algunos JavaScript para publicar un valor de formulario secreto. Sin el atributo de vinculación que limita los campos que utiliza el archivador de modelos cuando crea una instancia de Estudiante, el archivador de modelos recogerá ese valor de formulario secreto y lo usará para crear la instancia de entidad de Estudiante. Entonces, cualquier valor que el hacker haya especificado para el campo de formulario Secreto se actualizará en su base de datos. La siguiente imagen muestra la herramienta Fiddler agregando el campo Secreto (con el valor "OverPost") a los valores de formulario publicados. El valor "OverPost" se agregaría correctamente a la propiedad Secreta de la fila insertada, aunque nunca se pretendió que la página web pudiera establecer esa propiedad.
Es una buena práctica de seguridad utilizar el parámetro Incluir con el atributo Vincular a los campos de la lista blanca. También es posible usar el parámetro Excluir para poner en la lista negra los campos que desea excluir. El motivo por el que Incluir es más seguro es que cuando agrega una nueva propiedad a la entidad, el nuevo campo no está automáticamente protegido por una lista Excluir.
Bind
atributo Bind
permite "ajustar" el proceso de vinculación del modelo de cierto tipo de parámetro, sin registrar un ModelBinder
personalizado específico para el Tipo.
Por ejemplo, suponga que su acción está esperando un parámetro de Person
definido de la siguiente manera:
public class Person
{
public Person(string firstName, string lastName, Gender gender)
{
this.FirstName = firstName;
this.LastName = lastName;
if (gender == Gender.Male)
this.FullName = "Mr. " + this.FirstName + " " + this.LastName;
else
this.FullName = "Mrs. " + this.FirstName + " " + this.LastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public Gender Gender { get; set; }
// ''FullName'' is a computed column:
public string FullName { get; set; }
}
Y la acción:
public ActionResult Edit(Person person)
{
...
}
Ahora, si alguien está publicando el siguiente JSON:
{
"FirstName":"John",
"LastName":"Smith",
"Gender":"Male",
"FullName":"Mrs. John Smith"
}
Su acción ahora tendrá una person
con el nombre FullName
incorrecto (''Mrs'' en lugar de ''Mr'').
Para evitar dicho comportamiento, puede usar el atributo Bind
y excluir explícitamente la propiedad FullName
del proceso de enlace (''Black-list''):
public ActionResult Edit([Bind(Exclude="FullName")] Person person)
{
...
}
Alternativamente, puede usar Include
para ignorar (''Lista negra'') todas las propiedades y solo incluir (''Lista blanca'') las propiedades especificadas:
public ActionResult Edit([Bind(Include="FirstName,LastName,Gender")] Person person)
{
...
}
Más información en MSDN .