我的主要(MyProfile)视图包含当用户点击链接时,部分视图在div中加载来自DB的现有数据的链接,用户可以更新。
@Ajax.ActionLink("Update 1", "Update1", new { email = @ViewBag.Email }, new AjaxOptions() { HttpMethod = "GET", UpdateTargetId = "divCurrentView", InsertionMode = InsertionMode.Replace })
@Ajax.ActionLink("Update 2", "Update2", new { email = @ViewBag.Email }, new AjaxOptions() { HttpMethod = "GET", UpdateTargetId = "divCurrentView", InsertionMode = InsertionMode.Replace })
<div id="divCurrentView">
</div>
部分观点:示例:
_Update1:
@model ViewModels.Update1
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.id)
@Html.LabelFor(model => model.Name)
@Html.TextBoxFor(model => model.Name)
<input type="submit" value="Update" />
}
_Update2:
@model ViewModels.Update2
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.id)
@Html.LabelFor(model => model.Website)
@Html.TextBoxFor(model => model.Website)
<input type="submit" value="Update" />
}
在控制器中:
public PartialViewResult Update1(string email)
{
var model = populate the viewmodel
return PartialView("_Update1",model);
}
public PartialViewResult Update2(string email)
{
var model = populate the viewmodel
return PartialView("_Update2",model);
}
这并不意味着用户在访问主视图时会点击所有链接。
我希望得到反馈,如果我的方式是正确的,或者我应该在用户到达MyProfile View时加载所有数据并将数据存储在会话中以及每个部分视图加载时数据是否从会话中加载? 这样可以避免每次partilaview加载时调用db,还是有更好的方法?
谢谢,
更新
我尝试按建议使用缓存,但数据存储全局的问题。如果多个用户登录并尝试查看/更新数据,那么所有这些数据都是相同的我错过了什么?
这是尝试过的:
public PartialViewResult Update1(string email)
{
var cc = HttpRuntime.Cache.Get("cinfo");
Update1VM model = null;
if (cc == null)
{
model = populate the viewmodel
HttpRuntime.Cache.Insert("cinfo", model);
}
else
{
model = (Update1VM)cc;
}
return PartialView("_Update1", model);
}
答案 0 :(得分:1)
以您使用的方式使用Html.ActionLink
是一个很好的解决方案。它使控制器简单且可重复使用。您无需更改控制器即可轻松添加和删除视图。很容易将它们放在不同的视野中。
通常它是更灵活的解决方案。
如果你害怕每次总是使用一些缓存时都调用db,但在你的例子中,它只会在用户真正需要时查询db并单击它。
如果你把它放在一个视图中,它会更复杂,更混乱,更不容易出错。