ASP.NET MVC2 RenderAction使父视图松散ViewModel

时间:2010-08-09 10:03:16

标签: asp.net-mvc asp.net-mvc-2 datacontext renderaction

我是我的项目浏览器页面我有2个子元素保证他们自己的控制器(而不仅仅是用户控件) - 上传和FileBrowser,所以我使用Html.RenderAction(Action,Controller)添加它们,param)。

问题是,浏览页面需要ProjectViewModel,其中Upload使用UploadViewModel等。所以通过使用这些Html.RenderAction元素,Browse页面似乎立即停止接收ProjectViewModel - 我猜它切换到最后一个RenderAction的VM。

我是否需要在路由中设置以确保这些已经强类型的视图保持其上下文?

使用代码更新:

另外,也许我必须明确说明转到“上传”的模型是另一个?我不知道。

浏览器(包含Upload和FileBrowser):

<%@ 
Page Title="" 
Language="C#" 
Inherits="System.Web.Mvc.ViewPage<CKD.Web.Files.ViewModels.ProjectViewModel>"
MasterPageFile="~/Views/Project/Project.Master" 
%>

<asp:Content runat="server" ID="Main" ContentPlaceHolderID="MainContent">
    <table>
<tr>
<td id="upload" style="width: 180px" class="ui-widget ui-widget-content ui-corner-all">
    <% Html.RenderAction("Index", "Upload", new {id = Model.Project.Id}); %>
</td>
<td id="fileBrowser" style="width: auto" class="ui-widget ui-widget-content ui-corner-all">
    <% Html.RenderAction("Index", "FileBrowser", new {id = Model.Project.Id}); %>
</td>
</tr>
</table>
</asp:Content>

上传视图:

<%@ 
Page Title="" 
Language="C#" 
Inherits="System.Web.Mvc.ViewPage<CKD.Web.Files.ViewModels.UploadViewModel>" 
MasterPageFile="~/Views/Shared/Control.master"
%>
<%@ Import Namespace="System.IO" %>

<asp:Content runat="server" ID="Scripts" ContentPlaceHolderID="Scripts">
</asp:Content>

<asp:Content runat="server" ID="Main" ContentPlaceHolderID="MainContent">
<div class="uploadControl" style="Margin: 8px">
<h2 style="Margin-Bottom: 0px">Upload</h2>
<hr />

<div id="accordion" style="display: block;">
    <h3><a href="#">Files</a></h3>
    <div>
        <div class="ui-widget-content ui-corner-all" style="min-height: 80px; margin: 4px">
            <% if(Model.Files != null) %>
                <% foreach(FileInfo f in Model.Files) {%>
                    <p><%= f.Name %></p>
                    <hr />
                <% } %>
        </div>
        <ul style="width: 10px; list-style-type:none">
            <li class="ui-widget ui-widget-button ui-corners-all">Clear</li>
            <li class="ui-widget ui-widget-button ui-corners-all">Add</li>
        </ul>
    </div>
    <h3><a href="#">Transmittal</a></h3>
    <div>
        <p>File here</p>
        <p style="width: auto; margin: 8px" class="ui-widget-button">Pick File...</p>
    </div>
    <h3><a href="#">Notification</a></h3>
    <div>
        <p>
        Stuff
        </p>
    </div>
</div>
<div>
<div class="ui-widget ui-corner-all ui-widget-active">Upload Files</div>
</div>

</div>
</asp:Content>

上传控制器:

using System.Web.Mvc;

namespace CKD.Web.Files.Controllers
{
    using System.Linq;
    using Models;
    using ViewModels;

    public class UploadController : Controller
    {
        private ICKDClientAreaRepository Repository { get; set; }
        private UploadViewModel _viewModel;

                        private UploadViewModel ViewModel
    {
        get { return _viewModel ?? (_viewModel = ViewModel = UploadViewModel.Default(Repository)); }
        set { _viewModel = value; }
    }

                    public UploadController(ICKDClientAreaRepository repository)
    {
        Repository = repository;
    }

        // GET
        public ActionResult Index(int id)
        {
            var project = Repository.Projects.Single(x => x.Id == id);
            ViewModel = UploadViewModel.ForProject(project, Repository);

            return View(ViewModel);
        }
    }
}

上传VM:

namespace CKD.Web.Files.ViewModels
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Web.Security;
    using Models;

    public class UploadViewModel
    {
        public Project Project { get; set; }
        public DirectoryInfo Directory { get; set; }
        public User Uploader { get; set; }
        public DateTime Time { get; set; }

        public List<FileInfo> Files { get; set; }
        public FileInfo Transmittal { get; set; }

        public List<User> NotificationList { get; set; }

                        public static UploadViewModel Default(ICKDClientAreaRepository fromRepository)
    {
        var project = fromRepository.Projects.First();

        return ForProject(project, fromRepository);
    }

                                                                public static UploadViewModel ForProject(Project project, ICKDClientAreaRepository fromRepository)
    {
        var dir = project.DirectoryName;
        var uploader = fromRepository.Users.Single(x => x.Username == Membership.GetUser().UserName);
        var time = DateTime.Now;
        var notification = project.Users.ToList();

        return new UploadViewModel
        {
            Project = project,
            Directory = new DirectoryInfo(dir),
            Uploader = uploader,
            Time = time,
            NotificationList = notification
        };
    }
    }
}

1 个答案:

答案 0 :(得分:1)

尝试使RenderAction()部分视图呈现视图。

您还应该使用[ChildActionOnly]属性修饰操作,以防止它自己执行(当有人请求http://xxx.com/Upload/Index时)。