我对如何处理我的第一个MVC 3应用程序(剃刀上)的情况感到茫然。
我有一个页面,显示用户创建的目标列表。在该页面上,用户单击一个目标,然后进入目标详细信息屏幕。此屏幕显示目标的详细信息(目标名称、描述、状态)。它还显示了导致该目标的活动及其详细信息(活动名称、状态)。
我在"目标"模型中有目标,在"ilpActivity"模型中有活动。两者通过goal -> goalID
的主键连接。我有两个部分视图:_displayGoal和_activities显然_displayGoal需要目标模型,而_activities需要ilpActivity模型。
它们都使用ajax调用表单来允许编辑(以及创建活动)。
在我的主视图goalDetails中,我引用了目标模型。
我的问题-我不能使用@Html。部分调用_activities,因为它使用不同的模型。我认为我通过使用RenderAction清除了这个障碍-然而它在firefox中工作,但在IE中缓存。也就是说,除非刷新屏幕,否则不会看到我所做的更改。
我希望这是有意义的…基本上我需要调用两个使用两个模型的partialview。我读了不少书,但一直在努力使事情顺利进行。禁用缓存吗?-我试过这个,但duration = 0抛出错误
我需要一个可以调用两个模型的模型吗?-我不确定这在模型和控制器中是什么样子的。我正在拉一个目标的细节,同时拉一个活动列表。
我很困惑,欢迎任何建议。下面是一些代码:
我的模型:
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);
}
然后是my view:
@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>
我修好了。我不确定我理解为什么这工作…但问题在于javascript改变了partialview…
// 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