2014-09-22 43 views
1

我的主要(MyProfile)视图包含链接,当用户单击链接时,部分视图将加载数据库中的现有数据并由用户更新。MVC4将数据加载到局部视图中

@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" /> 
} 

在Controller:

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时是否应该加载所有数据?在会话中查看和存储数据以及何时从会话加载每个分部视图? 这会避免每次partilaview被加载时调用数据库,还是有更好的方法?

感谢,

UPDATE:

我尝试使用缓存的建议,但问题的数据是全球存储。如果多个用户登录并尝试查看/更新数据,那么所有数据都是相同的我错过了什么?

这是尝试:

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

取决于我们在会话中存储多少数据。如果它不是很多,那肯定是有效的。如果没有,那么你可能不想将它存储在会话中。 – Gjohn 2014-09-22 15:29:48

+0

多少数据是多少?我有大约20个领域。 – Ben 2014-09-22 15:41:34

+0

它会始终保持20场?这会改变吗?请记住,有一天你不会在那里,其他人将需要处理你创建的内容。就我个人而言,从来没有一个在会话中存储的东西的巨大风扇,只是因为往返数据库的往返行程是不希望的。 py3rstr的repsonse在需要时提供数据,而不是始终加载所有内容。 – Gjohn 2014-09-22 15:47:32

回答

1

使用Html.ActionLink在你使用的方法是很好的解决方案。它使控制器简单和可重复使用。您可以轻松添加和删除视图,而无需更改控制器。将它们置于不同的视野很容易。 通常它是更灵活的解决方案。

如果你害怕每次总是使用一些缓存时调用数据库,但在你的例子中,只有当用户真正需要时才会查询数据库并点击它。

如果你把它放在一个视图中,它会更复杂,更杂乱,更不容易出错。

+0

谢谢。场景用户点击update1链接,然后点击update2链接(前后)×10次而不修改数据。为了避免调用db额外的时间,我假设我应该使用缓存?或者如果用户更新一个partilaview的数据,我该如何将它存储在缓存中?你能提供一个我如何做的例子吗? – Ben 2014-09-22 16:09:01

+0

看看[System.Web.Caching.Cache](http://msdn.microsoft.com/en-us/library/system.web.caching.cache(v = vs.100))。aspX)你可以从数据库中缓存数据并在更新时删除请参阅[示例](http://patrickdesjardins.com/blog/using-the-system-web-cache-object-into-your-mvc3-project)。您还可以使用'Html.Action'帮助器以单个请求呈现所有子项操作。还有一些jquery tab插件可以在表单之间切换。在这种情况下,用户可以根据需要多次点击不创建数据库查询并且动作仍然是分开的。 – py3r3str 2014-09-22 16:59:16

+0

当你说在一个请求中渲染所有的孩子动作。你的意思是在我的主视图(myprofile)中将所有字段捕获到1个viewmodel中,然后为每个partialview添加选项卡并从一个viewmodel加载数据?所有的partialviews都使用相同的viewmodel? – Ben 2014-09-22 18:02:29