Просмотр с двумя частичными видами и двумя моделями - PullRequest
0 голосов
/ 15 сентября 2011

Я не знаю, как справиться с ситуацией в моем первом приложении MVC 3 (на бритве).

У меня есть страница, на которой отображается список созданных пользователем целей. На этой странице пользователь нажимает на цель и выводится на экран сведений о целях. Этот экран показывает детали цели (название цели, описание, статус). Он также показывает действия, которые ведут к этой цели, и их детали (название деятельности, статус).

У меня есть цели в модели «целей» и действия в модели «ilpActivity». Эти два связаны первичным ключом целей -> goalID

У меня есть два частичных просмотра: _displayGoal и _activities Очевидно, _displayGoal нужна модель целей, а _activities - модель ilpActivity.

Каждый из них использует ajax-вызовы для форм, которые позволяют редактировать (а также создавать для действий).

В моем основном представлении goalDetails я ссылаюсь на модель целей.

Моя проблема - я не могу использовать @ Html.Partial для вызова _activities, потому что он использует другую модель. Я думал, что преодолел это препятствие с помощью RenderAction - однако он работает в Firefox, но кэшируется в IE. То есть внесенные изменения не будут видны, пока я не обновлю экран.

Надеюсь, это имеет смысл ... в основном мне нужно вызвать два частичных представления, использующих две модели. Я прочитал довольно много, но изо всех сил пытался заставить вещи работать.

Отключить ли кэширование? - Я пытался это, но длительность = 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);
    }

А потом мой взгляд:

@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>

1 Ответ

0 голосов
/ 16 сентября 2011

Ну, я исправил это.Не уверен, что понимаю, почему это сработало ... но проблема была в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...