none
POST на PartialVeiw RRS feed

  • Вопрос

  • Продолжаю нудить о помощи в ASP.NET MVC. Работаю с тем же проектом что описал в ветке : http://social.msdn.microsoft.com/Forums/ru-RU/aspnetru/thread/f3c75180-0cbe-4108-a272-a6e8dd97c95e

    Сейчас другая проблема ( Ну почему все так не просто?)

    Мое представление (View) включает в себя Частичное представление (partial) и после необходимых изменений я хочу сохранить результат. 

    @using (Ajax.BeginForm("SubmitAction", "Home", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace}))
    {
    
        <h2>
            Index</h2>
        @Html.DisplayFor(x => x.ID)
        <br />
        @Html.TextBoxFor(x => x.FamilyName)
        <div style="float: left">
            @for (int i = 0; i < 3; i++)
            {
                <div style="float: left; padding-left: 30px">
                    @Ajax.ActionLink(Model.Members[i].Name, "GetPerson",
                    new RouteValueDictionary { {"modelID", Model.ID}, { "id", Model.Members[i].ID } }, 
                    new AjaxOptions() { UpdateTargetId = "memberDiv" })
                </div>
            }
        </div>
        <br />
        <br />
        <div id="memberDiv">
           @{Html.RenderPartial("MemberPartial", Model.SelectedPerson);}
        </div>
    
        <button type="submit" name="tab" value="1">
            Submit</button>
    }

    Я делаю SUBMIT на форму, нo к сожалению не получаю информацию о модели в Partial

    Поискал на форумах, но там предлагают использовать "EditorFor" вместо "RenderPartial". Но мне это не подходит.

    Помогите советом пожалуйста
    Спасибо

    10 июня 2013 г. 13:40

Ответы

  • Если нужно обновить часть страницы в котором содержится контрол, то нужно эту часть поместить в частичное представление и обнолять через Ajax. Это из под коробки. Есть ещё масса других способов. Если нет необходимости менять HTML разметку, а только данные то можно через JQuery и JSON, но думаю, что это на данном этапе будет для вас сложно.
    12 июня 2013 г. 15:41
    Модератор

Все ответы

  • "Я делаю SUBMIT на форму, нo к сожалению не получаю информацию о модели в Partial" - не получаете где, в контроллере или в самом представлении?
    10 июня 2013 г. 15:06
    Модератор
  • ДА, в контроллере, в функции которая ловит POST от SUBMIT. Часть модели которая вне "Partial" приходит как надо, но не та что в внутри
    10 июня 2013 г. 17:32
  • Под "не та что внутри", я думаю вы имеете это:

    Html.RenderPartial("MemberPartial", Model.SelectedPerson);

    Покажите разметку этого представления, там скорее всего что-то не так определяете.

    11 июня 2013 г. 11:02
    Модератор
  • Конечно. Вот:

    MODEL :

    public class FamilyModel
        {
            public int ID { get; set; }
            public string FamilyName { get; set; }
            public List<PersonModel> Members { get; set; }
            public PersonModel SelectedPerson { get; set; }
        }
    
       public class PersonModel
        {
           public int ID { get; set; }
           public string Name { get; set; }
        }
    

    VIEW :

    @model Pannels.Models.FamilyModel
    @{
        ViewBag.Title = "Index";
    }
    
    
    <script src="@Url.Content("~/Scripts/jquery-1.7.1.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
    
    @using (@Ajax.BeginForm("SaveData", new AjaxOptions { InsertionMode = InsertionMode.Replace }))
    {
    
        <h2>Index</h2>
        @Html.TextAreaFor(x => x.ID)
        <br />
        @Html.TextBoxFor(x => x.FamilyName)
        <div style="float: left">
            @for (int i = 0; i < 3; i++)
            {
                <div style="float: left; padding-left: 30px">
                    @Ajax.ActionLink(Model.Members[i].Name, "GetPerson", new RouteValueDictionary { { "id", Model.Members[i].ID } }, new AjaxOptions() { UpdateTargetId = "memberDiv" })
                </div>
            }
        </div>
        <br />
        <br />
        <div id="memberDiv">
            @{Html.RenderPartial("MemberPartial", Model.SelectedPerson);}
        </div>
        
        <button type="submit" id="saveButton" name="saveButton" value="1">Save</button>
    }

    Partial (memberpartial):

    @model Pannels.Models.PersonModel
    
    <div >
    
    @Html.TextAreaFor(x => x.ID)
    <br />
    @Html.TextBoxFor(x=>x.Name)
    
    </div>

    CODE ::

        public class HomeController : Controller
        {
            //
            // GET: /Home/
    
            public ActionResult Index()
            {
                FamilyModel family = GetFamily();
                return View(family);
            }
    
            public PartialViewResult GetPerson(int id = 0)
            {
                FamilyModel familyModel = GetFamily();
                PersonModel p = familyModel.Members.First(x => x.ID == id);
                return PartialView("MemberPartial", p);
            }
    
    
            public ActionResult SaveData(FamilyModel familyModel)
            {
                return View(familyModel);
            }
    
    
            private FamilyModel GetFamily()
            {
    
    ******code
            }
    
        }

    11 июня 2013 г. 11:39
  • Насколько я понял вам в контроллере нужно получить

    FamilyModel familyModel

    поле

    PersonModel

    которого пустое. Это происходит потому, что стандартная привязка модели уже не работает на вложенных уровнях. Поэтому вам нужно использовать уже немного сложную привязку. Вот вам инструкция, где подробно всё разъясняется. Прочтите внимательно и следуйте ей и это решит проблему.

    12 июня 2013 г. 6:16
    Модератор
  • Спасибо... Разобрался. Интерестная штука и делает то что надо, но я бы хотел пользоватьса Partial , так как мне необходимо, в некоторых случаях ( я описал это в предидущем посте) перегружать его и только его , а не всю страницу
    • Изменено Helge35 12 июня 2013 г. 13:07
    12 июня 2013 г. 11:42
  • А привязка модели одна и не имеет значения как приходят запросы, через XHR (AJAX) или полноценно.
    12 июня 2013 г. 13:24
    Модератор
  • А точно, я тоже ломал голову, почему так происходит. Век живи - век учись.
    12 июня 2013 г. 15:33
  • Вот тут я запутался. Я как раз спрашива в посте : http://social.msdn.microsoft.com/Forums/ru-RU/aspnetru/thread/f3c75180-0cbe-4108-a272-a6e8dd97c95e
    как обновить частичное представление без того что бы обновить всю страницу. Но обясните, пожалуйста как обновить "FditorFor<>" без того что бы перегузить всю страницу. Ведь в данном примере советуют сделать это изменение
    • Изменено Helge35 12 июня 2013 г. 15:37
    12 июня 2013 г. 15:33
  • Если нужно обновить часть страницы в котором содержится контрол, то нужно эту часть поместить в частичное представление и обнолять через Ajax. Это из под коробки. Есть ещё масса других способов. Если нет необходимости менять HTML разметку, а только данные то можно через JQuery и JSON, но думаю, что это на данном этапе будет для вас сложно.
    12 июня 2013 г. 15:41
    Модератор
  • У меня вопрос по той статье, ссылку на которую Вы скинули. Вопрос по этой теме, и я не стал заводить новую, а решил спросить тут.

    1. Для использования "шаблонизированных помощников" обязательно использовать строго фиксированную папку в корне проекта с названием EditorTemplates? Если да, ASP.NET проводит поиск в этой папке (если она существует) и пробегает по всем "шаблонизированным помощникам", чтобы в заголовке найти подходящую модель, чтобы потом вставить шаблон в HTML?

    2. В статье в самом главном представлении используется вызов расширенной функции @Html.EditorForModel(), откуда она (функция) знает какую модель использовать, чтобы найти связь этой модели с "шаблонизированным помощником" и использовать ее уже в результирующем представлении?

    12 июня 2013 г. 16:35
  • "1. Для использования "шаблонизированных помощников" обязательно использовать строго фиксированную папку в корне проекта с названием EditorTemplates? Если да, ASP.NET проводит поиск в этой папке (если она существует) и пробегает по всем "шаблонизированным помощникам", чтобы в заголовке найти подходящую модель, чтобы потом вставить шаблон в HTML?" - сейчас уже точно не вспомню, но помоему да. В MVC многое базируется на банальных соглашениях и это тоже скорее всего так.

    "откуда она (функция) знает какую модель использовать, чтобы найти связь этой модели" - тип модели же задаётся явно в представлении.

    13 июня 2013 г. 6:09
    Модератор
  • Просто в статье явного определения модели нет

    @using (Html.BeginForm()) {
      @Html.EditorForModel()
      <input type="submit" />
    }

    Наверное просто не сочли нужным написать. Хорошо, спасибо за объяснение!

    13 июня 2013 г. 6:12
  • Дав ссылку на стать я хотел в первую очередь, чтобы вы представили как примерно происходит привязка данных, это было основной целью, так как это важно. А шаблоны и прочее уже второстепенные вещи, мы их не используем. Хотя если время есть их знание лишними не будут для вас.
    13 июня 2013 г. 6:16
    Модератор
  • Может цель преследовалась другая, но зная свое стремление разобраться изнутри, я не мог не спросить непонятные мне вещи) А Вам особая благодарность, Вы вносите огромный вклад и оказываете большую помощь в нелегком изучении технологий, чего стоит хотя бы один Ваш блог
    13 июня 2013 г. 7:06
  • думаю, что это на данном этапе будет для вас сложно.

    Печально, но большое спасибо
    13 июня 2013 г. 7:42
  • Не стоит отчаиваться, это обычное явление. Просто нужно определённое время, чтобы всё это постепенно "переварить". Надо только двигаться вперёд, некоторое время спустя и это тоже будет пустяком. Самое главное работать над собой, вот главный ключ к успеху.
    13 июня 2013 г. 7:49
    Модератор
  • Уважаемые участники форума,

    Пожалуйста не забудьте помечать сообщения, которые вам помогли, как ответы. Это поможет другим людям с таким же вопросом быстрее найти ответ, а также будет и приятно отвечающему знать, что помог вам в нахождении решения.


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    13 июня 2013 г. 10:28
    Модератор