2010-05-01 3 views
1

Я рассматриваю компоненты частичного просмотра MVC Framework.MVC сохраняет PartialView в своем собственном контексте - игнорирует основной вид, содержащий частичный вид

Я хочу, чтобы мой частичный вид обрабатывался в своем собственном действии, а остальная часть представления обрабатывала себя, но я получаю исключение, потому что главная страница не запускает его просмотр.

Я обойду это неправильно?

My Main View (Работа/index.aspx):

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication3.Models.JobViewModel>" %> 
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% Html.RenderPartial("JobListing", Model.Jobs); %> 
</asp:Content> 

PartialView (Работа/JobListing.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<List<MvcApplication3.Models.Job>>" %> 

<table> 
<tr> 
    <td> Job Title </td> 
    <td> Job Location</td> 
</tr> 
<% 
    foreach (var job in Model) 
    { 
%> 
<tr> 
    <td> 
     <%= job.Title %> 
    </td> 
    <td> 
     <%= job.Location %> 
    </td> 
</tr> 
<% 
    } 
%> 

<% Html.BeginForm("DoSomeStuff", "Job", null, FormMethod.Post); %> 

    <%= Html.TextBox("SomeInfo") %> 

    <button type="submit" id="submit" /> 
<% Html.EndForm(); %> 

Главный контроллер как для главного вида (индекс) и PartialView (DoSomeStuff())

public class JobController : Controller 
{ 
    public ActionResult Index() 
    { 
     JobProvider provider = new JobProvider(Session); 

     JobViewModel vm = new JobViewModel(); 

     vm.Jobs = provider.GetJobs(); 

     return View(vm);   
    } 

    public PartialViewResult DoSomeStuff() 
    { 
     return PartialView("JobListing"); 
    } 
} 

Как вы можете видеть в частичном виде, она имеет свою собственную форму, которая отправляет к действию под названием DoSomeStuff(). Я хочу, чтобы это действие обрабатывало любые данные, отправленные из этой формы. , но при отправке формы основное действие (индекс) не срабатывает, а затем я получаю исключение, так как модель (.Models.JobViewModel) не передается в представление, в котором живет частичное представление (JobListings).

в основном, что я говорю, если у меня есть myview.aspx с большим количеством html.RenderPartialView ('apartialview'), который имеет формы в них, могу ли я получить его так, чтобы эти формы опубликовали свои собственные действия и основной вид (с каким когда-либо модель, наследуемая) обрабатывается также. Вместо этого, имея все формы представления кода в основном действии для представления.

Я делаю это неправильно?

ответ

1

я последую POST-перенаправлять-GET образец и определил бы DoSomeStuff как:

public class JobController : Controller 
{ 
    [HttpPost] 
    public RedirectToRouteResult DoSomeStuff(DoSomeStuffModel model) 
    { 
     //Do some stuff with model 
     return RedirectToAction("Index"); 
    } 
} 

Если вы не хотите перезагружать всю форму, вы можете использовать jQuery Form Plugin. Если вы его используете, вы можете остаться с PartialViewResult. После отправки частичной формы представления, если вы укажете опцию target, содержимое div, содержащего частичный код представления, будет заменено возвращенным html.

+0

Я боялся, что кто-то собирается сказать, что, поскольку я думал об этом как о решении, он просто чувствует себя грязным, если бы у меня было 5 частичных просмотров на странице, они все должны включать RedirectToAction («mainview»). Я нашел хорошее сообщение об этом здесь http://dotnetslackers.com/articles/aspnet/asp-net-mvc-2-0-using-multiple-actions.aspx упоминается использование атрибута, называемого [ChildActionOnly], который, по моему мнению, не может понять, какую пользу он приносит, помимо ограничения действия только формами в представлениях. – Mike

+0

@Mike: Потому что это только польза от этого. Вы используете '[ChildActionOnly]', поэтому никто не вызывает его вне вашей формы. если вам не нравится воссоздать весь вид, используйте jQuery и AJAX. ваш артист имеет информацию об использовании частичных форм с Microsoft AJAX и jQuery. Решение jQuery я бы изменил на один, используя 'JQuery Form Plugin', потому что он упрощает отправку формы. Попробуй. – LukLed

1

Вызывается действие DoSomeStuff()?

Если это не удивительно, это не работает. RenderPartial - это вызов частичной страницы напрямую без действия контроллера. Но, возможно, потому, что он существует, он вызывает этот метод. Однако этот метод не получает Джобс и также не передает модель обратно в представление, поэтому имеет смысл, что он не может получить модель представления.

Действительно, вы должны использовать RenderPartial, если вам не нужно действие, которое нужно выполнить. Если вы это сделаете, вы должны использовать Html.RenderAction или Html.Action

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