Я смотрю на partialview компоненты Платформы MVC.
я хочу, чтобы мое частичное представление было обработано в его собственном действии и для остальной части представления для обработки себя, но я получаю исключение, потому что основная страница не запускала свое представление.
Я обхожу это неправильный путь?
Мое Основное Представление (Jobs/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 (Jobs/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), не передается представлению, что partialview (JobListings) живет в.
в основном то, что я говорю, если у меня есть myview.aspx с большим количеством HTML. RenderPartialView ('apartialview'), которые имеют формы в них, может я получать его так, эти формы отправляют на свои собственные действия и основное представление (с тем, что когда-либо модель это наследовало), обрабатывается также. Скорее затем наличие всего представления формы кодирует в основном действии для представления.
я, делают эту несправедливость?
Я бы следовал шаблону POST-REDIRECT-GET и определил бы DoSomeStuff как:
public class JobController : Controller
{
[HttpPost]
public RedirectToRouteResult DoSomeStuff(DoSomeStuffModel model)
{
//Do some stuff with model
return RedirectToAction("Index");
}
}
Если вы не хотите перезагружать всю форму, вы можете использовать jQuery Form Плагин . Если вы его используете, вы можете остаться с PartialViewResult
. Если после публикации формы частичного просмотра вы укажете опцию target
, содержимое div, содержащего код частичного просмотра, будет заменено возвращенным html.
Вызывается ли действие DoSomeStuff()?
Если да, то неудивительно, что оно не работает. RenderPartial - это вызов частичной страницы напрямую, без наличия действия контроллера. Но, возможно, поскольку оно существует, вызывается этот метод. Однако этот метод не получает Jobs, а также не передает Model обратно в представление, поэтому логично, что он не может получить модель представления.
Действительно, вам следует использовать RenderPartial, если у вас нет необходимости в выполнении действия. Если есть, то следует использовать Html.RenderAction или Html.Action