将对象传递给局部视图

时间:2014-07-07 09:14:37

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

我有这个控制器,它在一个局部视图中提取一个我想渲染的对象:

public ActionResult EditPhoto(string id)
{
    var photo = RavenSession.Load<ContentPage>(id);
    return View("_editPhoto");
}

我希望将照片传递给我的部分视图。 在我看来,我有这个:

@{
    Html.RenderPartial("_editPhoto" );
}

我如何将我的照片传递到局部视图以便在其父级中呈现?

编辑: 这就是我将对象传递给控制器​​的方法:

@foreach (var item in Model.Photographys)
{
    <li class="span3" style="text-align: center">

        <div class="thumbnail thumbnail-1">
            @Html.ActionLink(item.Name,
                "EditPhoto",   // <-- ActionMethod
                new { id = item.Id }, // <-- Route arguments.
                null  // <-- htmlArguments .. which are none. You need this value
                //     otherwise you call the WRONG method ...
                //     (refer to comments, below).
            )

            <h3 style="margin-bottom: 10px;">@item.Name</h3>

            <div class="">
                <div class="">
                    <img src="@item.ImgUrl" alt="" style="visibility: visible; opacity: 1;">
                </div>
            </div>

            <section>
                <p>@item.Description</p>
                <a href="#" class="btn btn-1">Read More</a>
                <p>@item.IsAccordion</p>
            </section>
        </div>

    </li>
}

这条线似乎有问题:

@{
    Html.RenderPartial("_editPhoto" , Model);
}

模型得到强调,说明传入它的模型(Photo)不是正确的..似乎_editPhoto继承了与其父级相同的模型?

我设法在视图中执行此操作:

@{
    var i = new Photography();
    Html.RenderPartial("_editPhoto", i);
}

现在的问题是,partialView会在新窗口中呈现,而不是在我想要它的父窗口中呈现。

UPDATE 我要给这个最后一个,不要创建一个新问题:

这是我的控制器将照片传递到局部视图:

 public ActionResult EditPhoto(string id)
        {
            var photo = RavenSession.Load<ContentPage>(id) as Photography;

            return PartialView("_editPhoto", photo);               
        }

我的“主视图”包含此代码,用于呈现部分视图,并将照片发送给它:

<div class="form-control">
          @{
            var model = new Photography();
            Html.Partial("_editPhoto",model);
                        }

           </div>

这会打开一个新窗口,我的新照片会显示在该窗口中。我希望它在父视图中呈现的方式与我第一次访问页面时自动呈现的方式相同......

2 个答案:

答案 0 :(得分:5)

您的控制器操作方法应为:

    public ActionResult EditPhoto(string id)
    {
        var photo = RavenSession.Load<ContentPage>(id);
        return View("EditPhoto",photo);
    }

并且您的“EditPhoto”视图应为:

    @{ Html.RenderPartial("_editPhoto",Model); }

更新

您的控制器操作方法应为:

    public ActionResult Photos()
    {
        return View();
    }

    public ActionResult EditPhoto(string id)
    {
        var photo = RavenSession.Load<ContentPage>(id);
        return View(photo);
    }

您的“EditPhoto”应该是视图(不是部分视图),在链接点击时,调用“EditPhoto”操作方法并返回“EditPhoto”视图

答案 1 :(得分:2)

此问题似乎与您的previous question之一有关。

控制器应如下;

public ActionResult EditPhoto(string id)
{
    var photo = RavenSession.Load<ContentPage>(id);
    return PartialView("_editPhoto", photo);
}

在部分视图_editPhoto中,您可以拥有以下代码。我假设photo变量是Photography对象。

@model aPhoto_web.Models.AdminPages.Photography

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Photography</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })
            </div>
        </div>
    </div>
}

谢谢!