2012-10-10 78 views
6

Tengo una vista fuertemente tipada a un ViewModel. ¿Es posible pasar todos los datos de un modelo en la vista, de vuelta a una acción de controlador? ¿Algo como esto?Ajax.ActionLink publica todo el modelo desde una vista?

@Ajax.ActionLink("(Export to Excel)", "ExportCsv", "SurveyResponse", new { 
ResultsViewModel = Model }, new AjaxOptions {HttpMethod = "POST"}) 

y recoger los datos de ResultsViewModel como un parámetro en otro controlador

public ActionResult ExportCsv(ResultsViewModel resultsviewmodel) 
{ 

} 
+0

no, no puede pasar ViewModel como parámetro en @ Ajax.ActionLink si quiere estos en POST, entonces debe enviar el formulario usando Html.BeginForm o Ajax.BeginForm. O aún si quiere pasar valores usando el enlace Ajax.Action, pase cada valor individual de ViewModel. – Shivkumar

Respuesta

4

No, no se puede pasar todo el modelo de vista como éste en un enlace de acción. Se podía pasar sólo el id de este modelo y luego recuperar el modelo real de utilizar este id desde donde se recuperó inicialmente:

@Ajax.ActionLink(
    "(Export to Excel)", 
    "ExportCsv", 
    "SurveyResponse", 
    new { id = Model.Id }, 
    new AjaxOptions { HttpMethod = "POST" } 
) 

Como alternativa se podría serializar el modelo como un javascript literal y luego enviarlo como una datos JSON con la petición AJAX:

@Html.ActionLink(
    "(Export to Excel)", 
    "ExportCsv", 
    "SurveyResponse", 
    null, 
    new { @class = "exportCsv" } 
) 
<script type="text/javascript"> 
    $('.exportCsv').click(function() { 
     var model = @Html.Raw(Json.Encode(Model)); 
     $.ajax({ 
      url: this.href, 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      data: JSON.stringify(model), 
      success: function(result) { 

      } 
     }); 
     return false; 
    }); 
</script> 
0

intenta enviar tu ID de modelo para el controlador y obtener resultado JSON:

@Ajax.ActionLink("(Export to Excel)", "ExportCsv", "SurveyResponse", new { 
id = Model.Id }, new AjaxOptions {HttpMethod = "POST"}) 

Y en el controlador tendrá:

[HttpGet] 
public ActionResult ExportCsv(int id) 
{ 
//Here get the whole model from your repository for example: 
var model=GetModelByModelId(id); 
//And do everything you want with your model. 
return Json(model,JsonRequestBehavior.AllowGet); 
} 
+0

¿Por qué tiene '[HttpGet]' en el controlador y luego 'HttpMethod =" POST "' en la vista? – Zapnologica

0

Hice lo siguiente. En cierto modo, derrota el punto de HTTP POST en mi oppionion. Pero bueno, hace el trabajo.

Mi Ajax:

@Ajax.ActionLink("Delete", "RemoveSubjectFromCategory","Categories", new { SubjectId = item.Id, CategoryId = Model.Id }, new AjaxOptions {HttpMethod = "GET"}) 

Mi controlador:

[HttpGet] 
public async Task<ActionResult> RemoveSubjectFromCategory(RemoveSubjectFromCategoryModel model) 
{} 

Mi Encuadernación Modelo:

public class RemoveSubjectFromCategoryModel 
{ 
    [Required] 
    public int SubjectId { get; set; } 

    [Required] 
    public int CategoryId { get; set; } 
} 
1

Gestionado por debajo de hacer obras,

@Ajax.ActionLink("(Export to Excel)", "ExportCsv", "SurveyResponse", 
new { Model.F1, Model.F2, Model.OtherFields }, new AjaxOptions {HttpMethod = "POST"}) 

controlador

[HttpPost] 
public ActionResult ExportCsv(ResultsViewModel resultsviewmodel) 
{ 

} 

Este es un post HTTP, pero los datos no esté en "formulario de datos", que está codificado en la URL de solicitud (pero no un HTTP GET).

Parece que MVC convierte automáticamente los campos individuales en un solo modelo.

URL tiene un límite de longitud, el modelo grande puede fallar.

Cuestiones relacionadas