2014-02-25 4 views
1

На мой взгляд, это то, что у меня естьPass объект, с целью управления

 @foreach (var match in Model.CommonMatches) 
     { 
      <tr> 

       <td>@match.StartDateTime</td> 
       <td>@match.EndDateTime</td> 
       <td>@match.AvailableAttendees.Count()</td> 
       <td>@Html.ActionLink("Accept", "AcceptAppointment", "Appointment", new {commonMatch = @match })</td> 
      </tr> 
     } 

Model.CommonMatches имеет тип List<Window>

public class Window 
{ 
    public DateTime StartDateTime { get; set; } 
    public DateTime EndDateTime { get; set; } 
    public IEnumerable<DataModels.Attendee> AvailableAttendees { get; set; } 

} 

Это как значение передается от контроллера

[HttpGet] 
public ActionResult ViewStatus(Guid appointmentId) 
{ 
    var status = new ViewStatus 
    { 
     AttendeesWhoResponded = _appointmentRepository.GetAppointmentDetails(appointmentId).Attendees.Where(a=>a.HasResponded == true).ToList(), 
     NotAttending = _appointmentRepository.GetAppointmentDetails(appointmentId).Attendees.Where(a=>a.HasResponded == true && a.Responses == null).ToList(), 
     CommonMatches = _appointmentRepository.FindCommonMatches(appointmentId) 
    }; 
    return View(status); 
} 

ViewStatus класс

public class ViewStatus 
{ 
    public ViewStatus() 
    { 
     AttendeesWhoResponded = new List<DataModels.Attendee>(); 
     NotAttending = new List<DataModels.Attendee>(); 
    } 
    public List<DataModels.Attendee> AttendeesWhoResponded { get; set; } 

    public List<DataModels.Attendee> NotAttending { get; set; } 
    public IEnumerable<Window> CommonMatches { get; set; } 
} 

Действие в контроллере, ActionLink зрения вызова является:

[HttpGet] 
public ActionResult AcceptAppointment(Window commonMatch) 
{ 
    return Content("ac"); 
} 

Когда я проверить значение commonMatch в действии контроллера. Я получаю StartDateTime и EndDateTime, но я не получаю все значение AvailableAttendees. В настоящее время он отображается как null.

Доступные лица, которые я ожидаю, относятся к типу IEnumerable<Attendee>. Невозможно передать объект так, как я проходил?

Что мне делать, чтобы получить все значения AvailableAttendees в контроллере вместе с датами?

Edit 1:

<table class ="table-hover table-striped"> 
    <thead> 
     <tr> 
      <td>Start time</td> 
      <td>End time</td> 
      <td>Number of Attendees</td> 
     </tr> 
    </thead> 


      @for (var count = 0; count < Model.CommonMatches.Count();count++) 
      { 
       using (Html.BeginForm("AcceptAppointment", "Appointment", FormMethod.Post)) 
       { 
        <tr> 
         <td>@Model.CommonMatches[count].StartDateTime</td> 
         <td>@Model.CommonMatches[count].EndDateTime</td> 
         <td>@Model.CommonMatches[count].AvailableAttendees.Count()</td> 
         @*<td>@Html.ActionLink("Accept", "AcceptAppointment", "Appointment", new { commonMatch = @match })</td>*@ 


        @for(var j=0;j<Model.CommonMatches[count].AvailableAttendees.Count();j++) 
        { 
         <td>@Model.CommonMatches[count].AvailableAttendees[j].FirstName</td>//to check if the value is null or not, just a test 
         <td>@Html.HiddenFor(m=>Model.CommonMatches[count].AvailableAttendees[j].FirstName)</td> 
         <td>@Html.HiddenFor(m=>Model.CommonMatches[count].AvailableAttendees[j].LastName)</td> 
         <td>@Html.HiddenFor(m=>Model.CommonMatches[count].AvailableAttendees[j].Email)</td> 
         <td>@Html.HiddenFor(m=>Model.CommonMatches[count].AvailableAttendees[j].AttendeeId)</td> 
        } 
         <td><input type="submit" value="Accept"/></td> 
        </tr> 

       } 
      } 


</table> 
+0

И как вы передаете модель с контроллера? – Andrei

+0

@Andrei добавил его в вопрос. Все значения передаются для просмотра. Я вижу значения в браузере. – Cybercop

+0

Если вы не указали доступные атрибуты, но хотите использовать ленивую загрузку, вы должны добавить виртуальную версию в IEnumerable sander

ответ

2

Вы должны опубликовать свою модель обратно, это будет связано с изменением вашего метода контроллера к этому:

Контроллер

[HttpPost] 
public ActionResult AcceptAppointment(List<Window> model) 
{ 
    return Content("ac"); 
} 

Посмотреть

Вам будет нужна форма и кнопка отправки, а не ActionLink. Я использую форматирование таблицы для упрощения ниже.

Индексирование ваших коллекций с помощью цикла for, поэтому связующее устройство знает, как с ними обращаться, это фактически две петли, так как это коллекция в коллекции. Скрытые значения также должны отображаться для того, чтобы их можно было отправить назад (прошу простить любые опечатки).

@for(var i = 0; i < Model.CommonMatches.Count; i ++) 
{ 
      <div> 
       @using (Html.BeginForm("AcceptAppointment", "Appointment", FormMethod.Post) 
       { 
       @Html.HiddenFor(m => Model.CommonMatches[i].StartDateTime) 
       @Html.HiddenFor(m => Model.CommonMatches[i].EndDateTime) 
       @Model.CommonMatches[i].StartDateTime <br/> 
       @Model.CommonMatches[i].EndDateTime <br/> 

       @for(var j = 0; Model.CommonMatches[i].AvailableAttendees.Count; j++) 
       { 
         @Html.HiddenFor(m => Model.CommonMatches[i].AvailableAttendees[j].Prop1)<br/> 
         @Html.HiddenFor(m => Model.CommonMatches[i].AvailableAttendees[j].Prop2)<br/> 
       } 

       <input type="submit" value="Accept" /> 
     </div> 
     } 
} 
+0

Я думаю, что это сработает, но мне нужно найти, как иметь тег '' внутри таблицы. Теперь его высказывание не может содержать тег внутри таблицы. Есть ли у вас какие-либо идеи? – Cybercop

+0

@ Biplov13, '' не могут быть прямыми детьми '

'. Но это может быть под '
' –

+0

@Murali, поэтому мне нужно создать тег

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

2

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

<td>@Html.ActionLink("Accept", "AcceptAppointment", "Appointment", new {commonMatch = @match })</td> 

вызовы

[HttpGet] 
public ActionResult AcceptAppointment(Window commonMatch) 
{ 
    return Content("ac"); 
} 

Здесь вы перемещаетесь с помощью ссылки <a href>. В основном вы выдаете запрос на получение. В запросе get вы можете передать данные на сервер только через Query String. Но ваш случай, подготавливая строку запроса динамически, прежде чем перейти к URL-адресу, будет более сложным.Но вы можете сделать это с помощью JavaScript вроде onclick=prepareHref(this);

@Html.ActionLink("Accept", "AcceptAppointment", "Appointment", 
    new {commonMatch = @match }, new {onclick=prepareHref(this)}) 

Тогда в Javascript

function prepareHref(obj) 
{ 
var qsData="?StartDateTime='2014-02-25'&EndDateTime='2014-02-25'&AvailableAttendees[0].prop1=value1, etc"; // data should be obtained from other td elements 
obj.href=obj.href+qsData; 
} 

Но это не Рекомендованный способ сделать это.

В случае, если вы хотите открыть другую страницу и показать URL-адрес, лучше передать идентификатор и загрузить данные снова.

Вариант 1:

Лучший способ может быть представить деталь в скрытом поле, как объяснено @hutchonoid.

Вариант 2:

или представить детали в JQuery Ajax $.post метода. В любом случае вам необходимо использовать POST

@Html.ActionLink("Accept", "AcceptAppointment", "Appointment", 
    new {commonMatch = @match }, new {onclick=postMyData()}) 


function postMyData(){ 
    var postData={}; 
    postData.StartDateTime=''; 
    postData.EndDateTime=''; 
    postData.AvailableAttendees=[]; 
    //for each AvailableAttendees prepare object 
    postData.AvailableAttendees[0]= {}; 
    postData.AvailableAttendees[0].prop1=value1; 



    $.post('/Appointment/AcceptAppointment/',{data:postData},function(data){ 

    }); 
    return false; 
} 

[HttpPost] 
public ActionResult AcceptAppointment(Window commonMatch) 
{ 
    return Content("ac"); 
} 
+0

Вы можете увидеть редактирование в моем вопросе? В контроллере теперь говорится: «Доступные аттрибуты count = 0» – Cybercop

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