2012-04-06 3 views
2

Любой вход очень appriciated :)Как разместить Partial View Data

Я хочу знать одну вещь, может ли я разместить несколько частичные данные просмотр в MVC? (Означает, что я хочу, чтобы обновить частичные vews данные DATBASE)

Вот пример:

Модель: -

public class PassengerViewModel 
{ 
    public List<PassengerModel> Passengers { get; set; } 
    public ContactModel Contact { get; set; } 
} 

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

[RequiredAuthentication] 
    public ActionResult Passenger() 
    { 
     var passengrViewMdl = new PassengerViewModel() 
     { 
      Contact = new ContactModel(), 
      Passengers = psngrService.LoadPassengers(Convert.ToInt32(Session["LPORefNO"])) 
     }; 
     return View(passengrViewMdl); 
    } 
    [HttpPost] 
    public ActionResult Passenger(PassengerViewModel passengerViewModel) 
    { 
     Here i want to update Passengers & Contact information 
    } 

Вид: -

@model QR.LPO.Core.Models.PassengerViewModel 
@{ 
ViewBag.Title = "Add Passengers"; 
} 
@using (Html.BeginForm()) 
{ 
@Html.Partial("_Passenger", Model.Passengers); 
@Html.Partial("_PassengerContact", Model.Contact); 
<input type="submit" value="Submit" /> 
} 

Спасибо.

ответ

1

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

Это возможно благодаря спецификациям HTML, все данные по форме, которые отправляют buttom, отправляют для отправки URL-адреса действия.

1

Это будет работать почти так же, как и у вас есть - нет ничего, что было бы связано с частичными, что помешало бы этому, в конце концов, это важный вывод html.

Проблемы с кодом является то, что, предположительно, модель вашего _Passenger зрения типа Passengers и модель вашего _PassangerContact зрения типа Contact. Это означает, что если вы используете стандартные расширения HtmlHelper (например,или Html.TextboxFor(...), поля, которые они генерируют, не будут иметь полных имен, таких как Contact.Name, но вместо этого просто имена по отношению к их модели, такие как Name. Это приведет к сбою модели в неудачном действии.

Вы можете решить эту проблему в ряде направлений.

  1. Просто используйте один и тот же тип модели (PassengerViewModel) в ваших суб-представления, и писать код, как @Html.TextboxFor(m => m.Contact.Name).

  2. Вместо использования Html.Partial используйте Html.EditorFor(...). Это передает правильную информацию о префиксе в дочерний вид, поэтому имена полей генерируются должным образом.

  3. Явное установить префикс себя

Как это:

@{ 
    var childViewData = new ViewDataDictionary(this.ViewData); 
    childView.TemplateInfo.HtmlFieldPrefix = "Contact"; 
} 
@Html.Partial("_PassengerContact", Model.Contact, childViewData) 

Вы также можете посмотреть на создание Html.PartialFor перегружать себя, как описано в этом StackOverflow вопрос: ASP.NET MVC partial views: input name prefixes