2014-09-08 4 views
0

Нужен совет по подходу. Я разработал представление, используя структуру таблицы, чтобы получить необходимый мне макет, и заполнить эту таблицу контуром foreach на основе моего ViewModel.MVC Передача значений контроллеру

Я по существу хочу, чтобы пользователь мог обновлять некоторые поля, например noofusers и т. Д., И я хочу иметь кнопку addotcart, которая передаст эти значения контроллеру.

Проблема, которую я имею в настоящее время, это значения, которые не передаются формой, поскольку они существуют вне формы.

Если я вставляю значения в форму, я теряю любое форматирование, которое получаю от таблицы.

Если я повторить значения внутри формы, но изменить, чтобы скрытые за, я получаю значение от модели прошла в не обновленных значениях

Я искал другие должности и иметь другую должность здесь, где предложил не использовать foreach и использовать цикл for вместо этого, но это ничего не меняет по отношению к проблеме, которую я испытываю выше.

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

@model PagedList.IPagedList<ShoppingCartCatalogue> 
@using Mojito.Domain.ViewModels 
@using PagedList.Mvc; 
<link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" /> 
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Mojito Products</h2> 
<div class="col-md-9"></div> 
<div class="col-md-3"> 
    @using (Html.BeginForm("Index", "MojitoProducts", FormMethod.Get)) 
    { 
     <p> 
      @Html.TextBox("SearchString", ViewBag.CurrentFilter as string) 
      <input type="submit" value="Search" /> 
     </p> 
    } 
</div> 

<table class="table"> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.FirstOrDefault().ImageData) 
     </th> 
     <th> 
      @Html.ActionLink("Category", "Index", new { sortOrder = ViewBag.SortByCategory, currentFilter = ViewBag.CurrentFilter }) 
     </th> 
     <th> 
      @Html.ActionLink("Product", "Index", new { sortOrder = ViewBag.SortByProduct, currentFilter = ViewBag.CurrentFilter }) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.FirstOrDefault().Description) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.FirstOrDefault().TypeOfSubscription) 
     </th> 
     <th> 
      @Html.ActionLink("Price per user", "Index", new { sortOrder = ViewBag.SortByPrice, currentFilter = ViewBag.CurrentFilter }) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.FirstOrDefault().NoOfUsers) 
     </th> 
     <th> 
      @Html.DisplayNameFor(model => model.FirstOrDefault().TotalPrice) 
     </th> 

    </tr> 

    @foreach (ShoppingCartCatalogue t in Model) 
    { 

     <tr> 
      <td> 
       @if (t.ImageData != null) 
       { 
        <div class="pull-left" style="margin-right: 10px"> 
         <img class="img-thumbnail" width="75" height="75" 
          src="@Url.Action("GetImage", "MojitoProducts", 
                new { t.MojitoProductId })" /> 
        </div> 
       } 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => t.Category, new { Name = "Category", id = "Category" }) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => t.Name, new { Name = "Name", id = "Name" }) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => t.Description, new { Name = "Description", id = "Description" }) 
      </td> 
      <td> 
       @Html.EnumDropDownListFor(modelItem => t.TypeOfSubscription, new { Name = "TypeOfSubscription", id = "TypeOfSubscription" }) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => t.Price, new { Name = "Price", id = "Price" }) 
      </td> 
      <td> 
       @Html.TextBoxFor(modelItem => t.NoOfUsers, new { Name = "NoOfUsers", id = "NoOfUsers", type = "number", min = "1" }) 
      </td> 
      <td> 
       @if (t.TypeOfSubscription.ToString() == "Annual") 
       { 
        t.TotalPrice = t.Price * 12; 
       } 
       else 
       { 
        t.TotalPrice = t.Price; 
       } 
       @Html.DisplayFor(modelItem => t.TotalPrice, new { Name = "Total Price", id = "Total Price" }) 
      </td> 
      <td> 

       @using (Html.BeginForm("AddToCart", "ShoppingCart", FormMethod.Post)) 
       { 
        <div class="pull-right form-group"> 
         @if (Request.Url != null) 
         { 
          @Html.HiddenFor(modelItem => t.TypeOfSubscription, new { Name = "TypeOfSubscription", id = "TypeOfSubscription" }) 
          @Html.HiddenFor(modelItem => t.NoOfUsers, new { Name = "NoOfUsers", id = "NoOfUsers" }) 
          @Html.HiddenFor(modelItem => t.MojitoProductId, new { Name = "MojitoProductId", id = "MojitoProductId" }) 
          @Html.HiddenFor(modelItem => t.Category, new { Name = "Category", id = "Category" }) 
          @Html.HiddenFor(modelItem => t.Name, new { Name = "Name", id = "Name" }) 
          @Html.HiddenFor(modelItem => t.Description, new { Name = "Description", id = "Description" }) 
          @Html.HiddenFor(modelItem => t.Price, new { Name = "Price", id = "Price" }) 
          if (t.TypeOfSubscription.ToString() == "Annual") 
          { 
           t.TotalPrice = t.Price * 12; 
          } 
          else 
          { 
           t.TotalPrice = t.Price; 
          } 
          @Html.HiddenFor(modelItem => t.TotalPrice, new { Name = "Total Price", id = "Total Price" }) 
          @Html.Hidden("returnUrl", Request.Url.PathAndQuery) 
          <input type="submit" class="btn btn-success" value="Add to cart" /> 
         } 

        </div> 
       } 
      </td> 
     </tr> 

    } 

</table> 

<div class="col-md-12"> 
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount 
</div> 
@Html.PagedListPager(Model, page => Url.Action("Index", 
     new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter })) 
+1

Положить таблицу в форму? – Mark

+0

Я пробовал это, но все поля просто отображаются рядом друг с другом, кажется, что формат таблицы не применяется в форме. – ccocker

+1

Тогда это проблема css, а не проблема mvc. Сравните css, который применяется к таблице вне формы, при этом css применяется к таблице внутри формы. Вероятно, это просто вопрос добавления класса к таблице и вашего файла css. – Mark

ответ

0

3 Возможные решения:

  1. Не используйте HTML таблицы, но вместо того, чтобы использовать CSS для макета элементы управления внутри каждого элемента формы, чтобы дать вам табличный макет (например с помощью поплавков или позиционированы абсолютно элементы
  2. Использование JQuery для обновления обновить скрытые элементы с формой всякий раза, когда соответствующий контроль за пределы изменения формы (но с этим решением вашего просто рендеринг в два раза больше контроля, как необходимого и ваше недействительное HTML из-за DUPL icate ID's)
  3. Замените форму и отправьте элементы кнопкой и используйте jQuery ($.post()), чтобы отправить значения контроллеру. Преимущество этого метода заключается в том, что пользователь остается на форме и может продолжать добавлять дополнительные элементы в корзину покупок. На странице будет , а затем укажите ссылку на страницу просмотра, где показаны все товары, которые были добавлены
2

Это проблема css, а не проблема с mvc. Сравните css, который применяется к таблице вне формы, при этом css применяется к таблице внутри формы. Вероятно, это просто вопрос добавления класса к таблице и вашего файла css.

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