2011-09-15 39 views
0

我对如何处理我的第一个MVC 3应用程序(在剃须刀上)的情况感到茫然。查看两个部分 - 两个模型

我有一个显示用户创建目标列表的页面。在该页面上,用户点击目标并进入目标详细信息屏幕。此屏幕显示目标的详细信息(目标名称,说明,状态)。它还显示导致该目标的活动及其细节(活动名称,状态)。

我在'ilpActivity'模型中有'目标'模型和活动的目标。目标主键 - > goalID

我有两个局部视图:_displayGoal和_activities 显然_displayGoal需要目标模型,而_activities需要ilpActivity模型。

这些中的每一个都使用ajax调用表单来允许编辑(以及为活动创建)。

在我的主视图goalDetails中,我引用了目标模型。

我的问题 - 我不能使用@ Html.Partial调用_activities,因为它使用了不同的模型。我以为我通过使用RenderAction清除了这个障碍 - 但它在Firefox中工作,但在IE中缓存。也就是说,除非我刷新屏幕,否则我所做的更改不会被看到。

我希望这是有道理的......基本上我需要调用两个部分使用两个模型。我读了很多,但一直在努力让事情发挥作用。

我禁用缓存吗? - 我试过但持续时间= 0会引发错误

我需要一个可以调用两种模型的模型吗? - 我不确定在模型和控制器中看起来像什么。我在拉动活动的列表<>活动时拉动1个目标的细节。

我很困惑,欢迎任何建议。下面是一些代码:

我的模型:

namespace ILP.Models 
{ 
public class goalsModel 
{ 
    #region services 
    public interface IGoalsService 
    { 
     goals GetGoal(int id); 
     List<ilpActivity> GetGoalActivities(int id); 
    } 

    public class AssetService : IGoalsService 
    { 
     private goalsDataClassesDataContext qDB; 

     /// <summary> 
     /// reference the data context 
     /// </summary> 
     public AssetService() 
     { 
      qDB = new goalsDataClassesDataContext(); 
     } 

     #region IGoalsService Members 

     public goals GetGoal(int id) 
     { 
      return qDB.goals.Single(g => g.goalID == id); 
     } 
     public List<ilpActivity> GetGoalActivities (int id) 
     { 
      //return all activities for goal 'id' 
      return qDB.ilpActivities.Where(g => g.goalID == id). 
       OrderBy(g => g.activityName) 
       .ToList(); 
     } 

我的控制器:

 [Authorize] 
    public ActionResult ViewGoal(int goalID) 
    { 
     goals goal; 
     try 
     { 
      goal = qService.GetGoal(goalID); 
     } 
     catch 
     { 
      goal = new goals(); 
     } 
     return View(goal); 
    } 
     [Authorize] 
    public ActionResult _Activities(int goalID) 
    { 
     List<ilpActivity> activity; 
     try 
     { 
      activity = qService.GetGoalActivities(goalID); 
     } 
     catch 
     { 
      throw; 
     } 
     return PartialView(activity); 
    } 

然后我的观点:

@model ILP.Models.goals 

<div id="thisGoal"> 
@*@{ Html.RenderPartial("_ActiveGoals", Model);}*@ 
@Html.Partial("_EditDisplay", Model) 
</div> 

<br /> 

<div id="activities"> 
@{Html.RenderAction("_Activities", "Home", Model.goalID);} 
@*@Html.Partial("_Activities",Model)*@ 
</div> 
+0

也许是@ Html.RenderAction的功能? - 即使在IE中,它也会在编辑屏幕上首次提交时更新显示。然而,在调试模式下,我发现它再也不会在控制器中调用我的“_Activities”方法(所以它会在加载和第一次编辑时调用它 - 然后再也不会再次加载页面)。 –

+0

想通了!这是我的JavaScript ...只要系统让我(7个小时以上回答自我发贴) –

回答

0

嗯 - 我固定它。不知道我理解为什么这个工作......但问题是围绕着改变partialview的JavaScript ...

// Activity: Return to _Activities view 
function getActivityList() { 
    $.ajaxSetup({ cache: false }); 
    $('#activities').load('@Url.Action("_Activities", "Home", new { goalID = Model.goalID},null)'); 
} 
// Activity: Submit activity form 
function sendActivityForm() { 
    $("#activityform").submit(function (e) { 
     $.post($(this).attr("action"), 
      $(this).serialize(), 
      function (data) { 
       //$("#thisGoal").html(data); 
       if (data == '{"s":"success"}') { 
        getActivityList(); 
       } 
       else 
        return false; 
      }); 
     e.preventDefault(); 
    }); 
}; 

什么是不工作是要求我必须直接提交表单后:

// Activity: Submit activity form 
function sendActivityForm() { 
    $("#activityform").submit(function (e) { 
     $.post($(this).attr("action"), 
      $(this).serialize(), 
      function (data) { 
       //$("#thisGoal").html(data); 
       if (data == '{"s":"success"}') { 
        $('#activities').load('@Url.Action("_Activities", "Home", new { goalID = Model.goalID},null)');     } 
       else 
        return false; 
      }); 
     e.preventDefault(); 
    }); 
}; 

我不能说我的理解 - 但这种工作......并在IE和FF