ASP.NET MVC从局部视图传递数据

时间:2014-04-25 13:03:50

标签: asp.net asp.net-mvc asp.net-mvc-partialview actionresult

如何从ASP.NET MVC中的提交表单上的部分视图传递数据。

@using (Html.BeginForm("Edit", "BlogPost", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    ................
    @Html.Partial("PostImagesForPost",Model.PostImages)
}

PostImagesForPost - 局部视图:

@model IEnumerable<Blog.Models.PostImage>

<script type="text/javascript" src="~/Scripts/jquery.zoom.min.js"></script>

<div>

@{
    List<Blog.Models.PostImage> images =  Model.ToList();

    <ul class="images">

        @foreach (var img in images)
        {
            string parameterValue_small = "~/BlogPhotos/120/" + img.Photo.ToString();
            string parameterValue_big = "~/BlogPhotos/600/" + img.Photo.ToString(); 

            <li>
                <div id="jquery-image-zoom-example">
                    <span data-postid="@img.ID" data-delete="true" class="deletespan"></span>
                    <a href="@Url.Content(parameterValue_big)">
                        <img src="@Url.Content(parameterValue_small)"  data-postid="@img.ID"  class="zm" onclick="$('.jquery-image-zoom img').click()" />
                    </a>
                    <input type="checkbox" checked="checked" name="selectedImagesForDelete" style="display:none;" data-postid="@img.ID" value="@img.ID"  />
                </div>
            </li>
}
    </ul>

}

在提交函数上,参数 selectedImagesForDelete 为空。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(Post post,string[] selectedImagesForDelete)
    {...........}

3 个答案:

答案 0 :(得分:1)

这与您使用部分事实无关,而且与MVC中的模型绑定器的工作方式有关。对于可迭代的已过帐项目,模型绑定器需要ListProperty[index].ModelProperty形式的字段名称。问题是Html.*系列助手不会正确创建此名称,除非传递索引值,而foreach无法实现。解决方案是简单地使用for,而不是:

@for (var i = 0; i < images.Count(); i++)
{
    Html.EditorFor(m => image[i].SomeProperty)
}

通过传入索引(images[i])的值,帮助程序会识别出需要在名称中添加正确的索引html前缀,以便模型绑定器能够理解值的填充位置什么时候回来。

虽然,在您的情况下,您似乎实际上只是手动指定字段的HTML,这很好,但您在此时负责获取正确的名称值。

答案 1 :(得分:0)

我相信你的name属性需要在名称中包含索引:

创建一个名为index的索引变量,并在每次迭代后递增它

<input type="checkbox" name="selectedImagesForDelete[index]" value="2">

答案 2 :(得分:0)

实际上这是javascript文件的问题。从未检查过复选框。

<input type="checkbox"  name="selectedImagesForDelete" value="@img.ID"  />

但我解决了这个问题,现在一切都像预期的那样。

但是感谢您试图帮助我。我很感激。