Как передать объект из представления на основе флажков? - PullRequest
3 голосов
/ 19 июня 2011

Мне было интересно, возможно ли передать объект на основе выбора флажка.Я объясню себе: если есть выбранное значение, это действительно означает, что мне нужно передать объект, который представляет выбор, чтобы использовать его.

У меня есть этот код в моем представлении:

<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %>
   <%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br />
<% } %>

Как видите, у меня есть список типов объектов, которые я хочу передать контроллеру (Список)

Есть ли у кого-нибудь предложения?

спасибо

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Я бы настоятельно рекомендовал вам использовать модели представления, строго типизированные представления и шаблоны редактора.

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

public class CanalViewModel
{
    public string Name { get; set; }
    public bool Selected { get; set; }
}

затем контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new[]
        {
            new CanalViewModel { Name = "canal 1", Selected = false },
            new CanalViewModel { Name = "canal 2", Selected = true },
            new CanalViewModel { Name = "canal 3", Selected = false },
            new CanalViewModel { Name = "canal 4", Selected = false },
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(IEnumerable<CanalViewModel> model)
    {
        return View(model);
    }
}

и далее следует ~/Views/Home/Index.aspx представление:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master"
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.CanalViewModel>>" 
%>

<% using (Html.BeginForm()) { %>
    <%= Html.EditorForModel() %>
    <input type="submit" value="OK" />
<% } %>

и, наконец, вам понадобится шаблон редактора для канала, который будет выполняться для каждого элемента в модели (~/Views/Home/EditorTemplates/CanalViewModel.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.CanalViewModel>" 
%>

<div>
    <%= Html.HiddenFor(x => x.Name) %>
    <%= Html.CheckBoxFor(x => x.Selected) %>
    <%= Html.LabelFor(x => x.Selected, Model.Name) %>
</div>

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

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

0 голосов
/ 19 июня 2011

вы можете использовать javascript, собирая все отмеченные значения флажков (через запятую) в скрытом поле, затем считывая эти значения с вашего контроллера и разделяя его.

<% foreach (var _client in ViewData["channels"] as List<DigiTV.Models.CANAL>) { %>
<%= Html.CheckBox(_client.NOM_CANAL) %> <%= Html.Encode(_client.NOM_CANAL) %> <br />
<% } %>
 <%=Html.HiddenField("AllValues")%>

JavaScript (я использую JQuery)

   var allvalues='';
  $('input[type=checkbox]').each(function(index){
       if($(this).is(':checked'))
       {
          allvalues+=$(this).val();
       }
   });
   $('#AllValues').val(allvalues);

в вашем контроллере

  public ActionResult MyAction(FormCollection form)
  {
     String[] AllValues = form["AllValues"].Split(",");
  } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...