2014-09-22 2 views
1

В моем основном (MyProfile) представлении содержатся ссылки, которые, когда пользователь нажимает на ссылку, загружает частичный вид в div с существующими данными из БД, которые могут быть обновлены пользователем.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" /> 
} 

В контроллере:

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 и сохраняет данные в сеансе, и когда каждое частичное представление загружается, данные загружаются из сеанса? Это позволит избежать вызова db каждый раз, когда загружается 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

+0

сколько данных много? У меня около 20 полей. – Ben

+0

всегда будет оставаться 20 полями? Будет ли это когда-нибудь изменяться? Помните, что когда-нибудь вас там не будет, и кому-то еще придется иметь дело с тем, что вы создали. Лично я никогда не был большим поклонником хранения вещей в сеансе просто потому, что поездка туда и обратно не нужна. Ниже приведена рекомендация py3rstr при обслуживании данных, когда это необходимо, а не всегда загружать все. – Gjohn

ответ

1

Использование Html.ActionLink в способе использования является хорошим решением. Это делает контроллер простым и повторным использованием. Вы можете легко добавлять и удалять представления без изменений в контроллере. Их легко отличить в разных форматах. Как правило, это более гибкое решение.

Если вы боитесь называть db каждый раз, когда вы всегда можете использовать некоторое кеширование, но в вашем примере он будет запрашивать db только тогда, когда пользователь действительно нуждается в нем и щелкните по нему.

Если вы поместите это в один вид, это будет более сложным, более грязным и менее подверженным ошибкам.

+0

Спасибо. Пользователь сценария нажимает на ссылку update1, а затем на ссылку update2 (назад и вперед) x 10 раз, не изменяя данные. Чтобы избежать вызова db дополнительных времен, я предполагаю, что я должен использовать кеширование? или что, если пользователь обновляет данные одного partilaview, я храню его в кеше? можете ли вы представить пример того, как я это сделаю? – Ben

+0

Взгляните на [System.Web.Caching.Cache] (http://msdn.microsoft.com/en-us/library/system.web.caching.cache (v = vs.100).aspX). Вы можете кэшировать данные из db и удалять, когда они обновляются, см. [пример] (http://patrickdesjardins.com/blog/using-the-system-web-cache-object-into-your-mvc3-project). Вы также можете использовать хелпер Html.Action для рендеринга всех действий с детьми в одном запросе. И некоторые плагины вкладки jquery для переключения между формами. В этом случае пользователь может щелкнуть столько раз, сколько захочет, не создавая db queris, и действие все равно будет разделено. – py3r3str

+0

Когда вы произносите действие всех детей в одном запросе. Вы имеете в виду, что на моем главном представлении (myprofile) фиксируются все поля в 1 viewmodel, а затем есть вкладки для каждого частичного просмотра и загрузки данных из одной модели? все частичные просмотры используют одну и ту же модель просмотра? – Ben

Смежные вопросы