Ajax.ActionLink从视图中发布整个模型?

时间:2012-10-10 21:07:36

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework razor

我有一个强烈键入ViewModel的视图。是否可以从视图中的模型传递所有数据,返回到控制器操作?像这样的东西?

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

然后从ResultsViewModel收集数据作为另一个控制器中的参数

public ActionResult ExportCsv(ResultsViewModel resultsviewmodel)
{

}

4 个答案:

答案 0 :(得分:4)

不,您无法在动作链接中传递这样的整个视图模型。您只能传递此模型的id,然后使用此id从您最初检索到的位置检索实际模型:

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

作为替代方案,您可以将模型序列化为javascript文字,然后使用AJAX请求将其作为JSON数据发送:

@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>

答案 1 :(得分:1)

管理以下作品,

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

控制器

[HttpPost]
public ActionResult ExportCsv(ResultsViewModel resultsviewmodel)
{

}

这是一篇http帖子,但不在&#34;中的数据形成数据&#34;,它在请求的URL中编码(但不是http get)。

看起来MVC会自动将各个字段转换为单个模型。

网址有长度限制,大型模型可能会失败。

答案 2 :(得分:0)

尝试将模型的Id发送到控制器并获取json结果:

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

在控制器中你将拥有:

[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);
}

答案 3 :(得分:0)

我做了以下事情。在我的反击中,它有点击败了HTTP POST。但是,嘿,它完成了工作。

我的Ajax:

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

我的控制器:

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

My Binding Model:

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

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