Добавление флажков для каждой строки в сетке MVCcontrib - PullRequest
10 голосов
/ 19 июня 2010

Как я могу добавить флажок для каждой строки сетки MVCcontrib. затем, когда форма размещена узнать, какие записи были выбраны? Я не нахожу много при поиске этого. Спасибо

Ответы [ 4 ]

9 голосов
/ 19 июня 2010

Вот как можно продолжить:

Модель:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsInStock { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var products = new[]
        {
            new Product { Id = 1, Name = "product 1", IsInStock = false },
            new Product { Id = 2, Name = "product 2", IsInStock = true },
            new Product { Id = 3, Name = "product 3", IsInStock = false },
            new Product { Id = 4, Name = "product 4", IsInStock = true },
        };
        return View(products);
    }

    [HttpPost]
    public ActionResult Index(int[] isInStock)
    {
        // The isInStock array will contain the ids of selected products
        // TODO: Process selected products
        return RedirectToAction("Index");
    }
}

Вид:

<% using (Html.BeginForm()) { %>
    <%= Html.Grid<Product>(Model)
            .Columns(column => {
                column.For(x => x.Id);
                column.For(x => x.Name);
                column.For(x => x.IsInStock)
                      .Partial("~/Views/Home/IsInStock.ascx");
            }) 
    %>
    <input type="submit" value="OK" />
<% } %>

Частичная:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyNamespace.Models.Product>" %>
<!-- 
    TODO: Handle the checked="checked" attribute based on the IsInStock 
    model property. Ideally write a helper method for this
-->
<td><input type="checkbox" name="isInStock" value="<%= Model.Id %>" /></td>

И, наконец, вот вспомогательный метод, который вы можете использовать для создания этого флажка:

using System.Web.Mvc;
using Microsoft.Web.Mvc;

public static class HtmlExtensions
{
    public static MvcHtmlString EditorForIsInStock(this HtmlHelper<Product> htmlHelper)
    {
        var tagBuilder = new TagBuilder("input");
        tagBuilder.MergeAttribute("type", "checkbox");
        tagBuilder.MergeAttribute("name", htmlHelper.NameFor(x => x.IsInStock).ToHtmlString());
        if (htmlHelper.ViewData.Model.IsInStock)
        {
            tagBuilder.MergeAttribute("checked", "checked");
        }
        return MvcHtmlString.Create(tagBuilder.ToString());
    }
}

Что упрощает частичное:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyNamespace.Models.Product>" %>
<td><%: Html.EditorForIsInStock() %></td>
3 голосов
/ 15 ноября 2012

Не знаю, поможет ли это, но я сделал похожую вещь, используя код ниже:

@Html.Grid(Model.PagedModel).AutoGenerateColumns().Columns(column => {
column.For(a => Html.ActionLink("Edit", "Edit", new { a.ID })).InsertAt(0).Encode(false);
column.Custom(a => Html.Raw("<input type='checkbox' name='resubmit' value='" + a.ID + "'/>" ) );
})

Мой контроллер смог получить выбранные элементы списка флажков:

[HttpPost]
public ViewResult List(string[] resubmit)
0 голосов
/ 07 марта 2013

По вашему мнению (скажем, ReportList.cshtml) включите вашу сетку в форму и определите действие для формы

<html>
<form action="/SubmitReportList">
            @{Html.Grid((List<NetSheet.Models.Report>)ViewData["ReportList"])
       .Sort((GridSortOptions)ViewData["sort"])
       .Attributes(id => "grid", @class => "grid")

       .Columns(column =>
       {
            column.For(c => Html.CheckBox("chkSelected", new { @class = "gridCheck",   @value = c.ReportId }))
            .Named("").Encode(false)
            .Attributes(@class => "grid-column");


column.For(c => c.ReportName)
              .Named("Buyer Close Sheet Name")
              .SortColumnName("ReportName")
               .Attributes(@class => "grid-column");

       })
       .Render();}

<input type="submit" name=" DeleteReports" id=" DeleteReports" value="Delete" class="btnSubmit"/>

</form>
</html>

Затем в контроллере реализуйте метод действия

public ActionResult SubmitReportList (string ReportListSubmit, IList<string> chkSelected){
    // The IList chkSelected will give you a list of values which includes report ids for the selected reports and “false” for the non-selected reports. You can implement your logic accordingly. 
    return View("ReportList");
    }
0 голосов
/ 28 декабря 2010

Для решения этой проблемы в каждом запросе get я добавляю значение флажка в виде строки, разделенной запятой.Затем извлеките значения из строки запроса.

$("#pageLayout a").click(function () {
        //Check for the click event insed area pageLayout
        //get the href of link
        var link = $(this).attr('href');
        var apps = '';

        //for all the checkbox get the checked status
        $("input:checkbox").each(
            function () {
                if ($(this).attr('name') != 'IsChecked') {
                    if (apps != '') {
                        apps = apps + ',' + $(this).attr('name') + '=' + $(this).is(':checked');

                    }
                    else {
                        apps = $(this).attr('name') + '=' + $(this).is(':checked');
                    }
                }

            }
            )


        //Used to check if request has came from the paging, filter or sorting. For the filter anchor href doesnt haave
        //any query string parameter. So for appending the parameter first ? mark is used followed by list of query string 
        //parameters. 
        var index = link.lastIndexOf('?');            

        //If there is no question mark in the string value return is -1
        if (index == -1) {
            //url for the filter anchor tag
            //appList hold the comma sep pair of applicationcode=checked status
            link = link + '?appList=' + apps + '&profileName=' + $('#ProfileName').val();
        }
        else {
            //url for sorting and paging anchor tag                
            link = link + '&appList=' + apps + '&profileName=' + $('#ProfileName').val();

        }


        //Alter the url of link
        $(this).attr('href', link);


    });
...