2016-09-06 3 views
0

У меня возникает проблема в частичном рендеринге. Я огляделся и обнаружил, что вы должны передать путь к частичному представлению в качестве первого параметра, а ваша модель - второму параметру, если вы используете его, поскольку это одна из перегрузок. Я получаю страницу без всякого взрыва, но частичное представление не выводит мои ожидаемые результаты, и я не могу попасть в точку останова на этом частичном (он использует цикл). Я подтвердил, что передаю ему модель с данными, но частичная, похоже, не попадает. Вот мой контроллер и частичные.Рендеринг Частично не визуализируется .NET mvc

DataBass db = new DataBass(); 

    public ActionResult Address() 
    { 
     Models.ViewModels.CheckoutViewModel x = new Models.ViewModels.CheckoutViewModel(); 

     if (User.Identity.IsAuthenticated) 
     { 
      using(DataBass oDB = new DataBass()) 
      { 
       var Customer = oDB.Customers.First(c => c.Email.ToLower() == User.Identity.Name.ToLower()); 
       var AvailableAddresses = oDB.AddressBooks.Where(ab => ab.CustomerID == Customer.ID).ToList(); 
       x.CustomerID = Customer.ID; 
       x.HasExistingAddresses = (AvailableAddresses.Count > 0 ? false : true); 
       x.AvailableAddresses = AvailableAddresses; 


      } 
      //var UserAddresses = db.AddressBooks.Where(a => a.Customer.Email == User.Identity.Name); 
      //ViewBag.Addresses = UserAddresses; 
      return View("Shipping", x); 
     }     
     else 
      return View("Index"); 
    } 

И вот частичный вид, с которым я столкнулся. Это то, что не попадает.

@model IEnumerable<Models.AddressBook> 

<h2>AddressBook</h2> 

<table class="table"> 
    <tr> 
     <th> 
      Address 2 
     </th> 
     <th> 
      Address 1 
     </th> 
     <th> 
      City 
     </th> 
     <th> 
      State 
     </th> 
     <th> 
      Postal Code 
     </th> 
     <th></th> 
    </tr> 

    @foreach (var item in Model) 
    { 
     var states = (List<Models.State>)ViewBag.States; 

     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Address1) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Address2) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.City) 
      </td> 
      <td> 
       @states.FirstOrDefault(x => x.ID.ToString() == item.StateID).Name 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Zipcode) 
      </td> 
      <td> 
       @Html.ActionLink("Choose this one","", new { id = item.ID}, new { @class="button"}) 
       @*@Html.ActionLink("Edit", "EditAddress", new { id = item.ID }, null) | 
       @Html.ActionLink("Delete", "DeleteAddress", new { id = item.ID }, null) 

       @*<a href="/Account/EditAddress/@item.AddressBook_ID">Edit</a> | 
        <a href="/Account/DeleteAddress/@item.AddressBook_ID">Delete</a> 
       @Html.ActionLink("Edit", "EditAddress", new { id = item.ID }, null) | 
       @Html.ActionLink("Edit", "EditAddress", "Account",new { id=item.AddressBook_ID }, htmlAttributes: null) | 
       @Html.ActionLink("Delete", "DeleteAddress", new { id = item.ID }, null)*@ 
      </td> 
     </tr> 
    } 

</table> 

А вот мое мнение, что это вызов renderpartial метод к ChooseExistingAddress.cshtml парциальное показано выше.

@model Models.ViewModels.CheckoutViewModel 

@{ 
    ViewBag.Title = "Shipping Selection"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Shipping</h2> 
@if (Model.HasExistingAddresses) 
{ 
    Html.RenderPartial("~/Views/Checkout/ChooseExistingAddress.cshtml", Model.AvailableAddresses); 

} 
else 
{ 
    Html.RenderPartial("~/Views/Checkout/AddNewShippingAddress.cshtml"); 
} 
+1

Change "~/Views/Checkout/ChooseExistingAddress.cshtml" до "ChooseExistingAddress", "Касса" – JB06

+0

Модифицированный его Html.RenderPartial ("ChooseExistingAddress", модели .AvailableAddresses); и я все равно получаю тот же результат. Не существует перегрузки для просмотра, контроллера и модели. – ddeamaral

+0

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

ответ

3

У тебя есть троичной логики в обратном направлении:

x.HasExistingAddresses = (AvailableAddresses.Count > 0 ? false : true); 

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

x.HasExistingAddresses = AvailableAddresses.Count > 0; 
+0

Вы можете упростить его еще больше, используя метод LINQ Any; AvailableAddresses.Any(). Использование свойства Count будет быстрее, но я сомневаюсь, что будет заметная разница. – JB06

+0

Это сработало. Спасибо, была ошибкой новичка с моей стороны. – ddeamaral

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