none
MVC - разделение кода и разметки RRS feed

  • Вопрос

  • Приложение MVC 5 с использованием entity-framework 6.0

    У меня вопрос по разделению кода и разметки

    код контролёра -

     private DBContext db = new DBContext();

    public ActionResult Index() { User user = db.Users.Where(m => m.username == HttpContext.User.Identity.Name).Include(m => m.Role).FirstOrDefault(); var purchases = db.Purchases.Where(r => r.usernameP == user.username);  return View(purchases.ToList()); }


    код Представления

    <p>
        @Html.ActionLink("New Закупка", "Create")
    </p>
    @{
        zakaz.Models.Purchase p = new zakaz.Models.Purchase();
    
    }
    @{
        var grid = new WebGrid(Model, canPage: true, rowsPerPage: 17, selectionFieldName: "selectedRow", ajaxUpdateContainerId: "gridContent");
        grid.Pager(WebGridPagerModes.All, numericLinksCount: 10);}
    <div id="gridContent">
        <div>
            @grid.GetHtml(tableStyle: "webGrid",
                             headerStyle: "headerWG",
                    alternatingRowStyle: "alt",
                    selectedRowStyle: "select",
                    columns: grid.Columns(grid.Column("nameP", "Наименование закупки", format: @<text>@Html.ActionLink((string)item.nameP, "Details", "Purchase", new { id = item.id }, null)</text>, style: "px500"),
                                                      grid.Column("summaOM", "Сумма закупки", format: (item) => string.Format("{0:C}", item.summaOM), style: "px90"),
                                                      grid.Column("summaZK", "Сумма заключенного контракта", format: (item) => string.Format("{0:C}", item.summaZK), style: "px90"),
                                                      grid.Column("numberP", "Номер заключенного контракта", null, style: "px90"),
                                                      grid.Column("dateP", "Дата заключенного контракта", format: (item) => string.Format("{0:dd.MM.yyyy}", item.dateP), style: "px90"),
                                                      grid.Column(header: "status1 + status2", canSort: false, format: (item) => @Html.Raw("<input name='status1' type='checkbox' value='@item.status1'  " + (item.status1 == 1 ? "checked" : null) + "/><br /><input name='status2' type='checkbox' value='@item.status2'" + (item.status2 == 1 ? "checked" : null) + "/>"), style: "px90"),
                                                      grid.Column("id", " ", format: (item) =>
                                                            {
                                                                var links = Html.ActionLink("[replacetext]", "Edit", new { id = item.id }).ToHtmlString().Replace("[replacetext]", "<img src=\"/Content/images/Edit.png\"/>") + " " +
                                                                            Html.ActionLink("[replacetext]", "Delete", new { id = item.id }).ToHtmlString().Replace("[replacetext]", "<img src=\"/Content/images/Delete.png\"/>");
                                                                return Html.Raw(links);
                                                            }, style: "px90")
                                                                  )
                                                  )
        </div>
    </div>

    1. Форматирование (string.Format("{0:C}" и string.Format("{0:dd.MM.yyyy}") и @Html.Raw("<input name="status1" type="checkbox" value="@item.status1" "="" +="" (item.status1="=" 1="" ?="" "checked"="" :="" null)="" +="" "=""/> ) построено в коде ПРЕДСТАВЛЕНИЯ 
    в классическом ASP.NET при создании GridView всё это можно было определить в коде. Возможно ли перенести это в код контролера

    2. Добавление var links... в Представлении полностью формируется или это так же можно перенести в код Контролёра?



    • Изменено krakoss 10 ноября 2014 г. 3:57 уточнение
    9 ноября 2014 г. 11:10

Ответы

  • Вы можете все операции перенести в контроллер, а результат (строка из HTML) может быть передана в модель и выведена при помощи @Html.Raw.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа krakoss 13 марта 2016 г. 18:36
    10 ноября 2014 г. 6:53
    Модератор

Все ответы

  • Вы можете все операции перенести в контроллер, а результат (строка из HTML) может быть передана в модель и выведена при помощи @Html.Raw.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа krakoss 13 марта 2016 г. 18:36
    10 ноября 2014 г. 6:53
    Модератор
  • Вопрос частично решен 
    1. Использовал @using PagedList (ListView мне и в классическом ASP.NET нравиться больше чем GridView) 
    2. В классе модели определил [DisplayFormat] для полей даты и денежного формата
    [DisplayFormat(DataFormatString = "{0:C}")]
    public decimal summaZK { get; set; }
    
    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}")]
    public Nullable<DateTime> dateP { get; set; }
    Но остается вопрос по формированию запроса с использованием Entity Framework в PurchaseController
    как его правильно создать 
    var order = db.Purchases.Where(r => r.usernameP == user.username) .ToList();
    чтобы получить не все поля из Model - Purchase.cs
    а только те что необходимы и после провести их форматирование в PurchaseController
    @model PagedList.IPagedList<zakaz.Models.Purchase>
    @using PagedList.Mvc
    @{
        ViewBag.Title = "Закупка";
    }
    <link href="@Url.Content("/Content/PagedList.css")" rel="stylesheet" type="text/css" />
    
    <div id="CurrentContent">
        <table class="container center">
            <tr>
    
                <th class="px300 center">
                    Наименование закупки
                </th>
                <th class="px120 center">
                    Сумма<br />закупки
                </th>
                <th class="px120 center">
                    Сумма<br />заключенного<br />контракта
                </th>
                <th class="px120 center">
                    Номер<br />заключенного<br />контракта
                </th>
                <th class="px120 center">
                    Дата<br />заключенного<br />контракта
                </th>
    
                <th class="px60 center">
                    status1
                </th>
    
                <th class="px60 center''">
                    status2
                </th>
                <th class="px90 center">
                    <p>
                        @Html.Raw(Html.ActionLink("[replacetext]", "Create").ToHtmlString().Replace("[replacetext]", "<img src=\"/Content/images/rtf.png\"/>"))
                    </p>
                </th>
            </tr>
    @if(Model.Count > 0)
    {
            foreach (var item in Model)
            {
                <tr>
    
                    <td class="left">
                        @Html.DisplayFor(modelItem => item.nameP)
                    </td>
                    <td class="right">
                        @Html.DisplayFor(modelItem => item.summaOM)
                    </td>
                    <td class="right">
                        @Html.DisplayFor(modelItem => item.summaZK)
                    </td>
                    <td class="right">
                        @Html.DisplayFor(modelItem => item.numberP)
                    </td>
                    <td class="right">
                        @Html.DisplayFor(modelItem => item.dateP)
                    </td>
    
                    <td class="center">
                        @Html.DisplayFor(modelItem => item.status1)
                    </td>
    
                    <td class="center">
                        @Html.DisplayFor(modelItem => item.status2)
                    </td>
                    <td class="center">
                        @Html.Raw(Html.ActionLink("[replacetext]", "Edit", new { id = item.id }).ToHtmlString().Replace("[replacetext]", "<img src=\"/Content/images/Edit.png\"/>"))
                        @Html.Raw(Html.ActionLink("[replacetext]", "Delete", new { id = item.id }).ToHtmlString().Replace("[replacetext]", "<img src=\"/Content/images/Delete.png\" />"))
                    </td>
                </tr>
            }
    }
     else
    {
        @: Записи не найдены. Извините!
    }
        </table>
    
        @if (Model.PageCount > 1)
        {
            <div id="paged-list" class="center footerPL">
                @Html.PagedListPager(Model, page => Url.Action("Index", new { page }), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(
                        new PagedListRenderOptions
                        {
                            LinkToFirstPageFormat = "В начало",
                            LinkToPreviousPageFormat = "Назад",
                            LinkToNextPageFormat = "Вперед",
                            LinkToLastPageFormat = "В конец"
                        },
                         new AjaxOptions
                         {
                             HttpMethod = "GET",
                             UpdateTargetId = "CurrentContent"
                         }
                ))
            </div>
        }
    </div>
    Как создать что то подобное - ListView DataBound
    11 ноября 2014 г. 8:49
  • "Но остается вопрос по формированию запроса с использованием Entity Framework в PurchaseControllerкак его правильно создать" - т.е. вам нужно вытягивать из БД не все данные?

    Сделаем содержимое сообщества лучше, вместе!

    15 ноября 2014 г. 10:57
    Модератор
  • Да 

    1. Необходимо только те поля что есть в представлении 

    2. Как в коде контролера формировать данные для отображения во VIEW чекбокса?

    С уважением Юрий Косенко 

    15 ноября 2014 г. 12:28