Почему мой список <string>не связывается с рядом скрытых полей при использовании Html.Hidden ()? - PullRequest
1 голос
/ 19 января 2011

Я пытаюсь использовать связыватель модели по умолчанию в asp.net mvc, чтобы связать список скрытых полей

<input id="entity" name="entity" type="hidden" value="/string/one/here" />
<input id="entity" name="entity" type="hidden" value="/another/string/here" />
<input id="entity" name="entity" type="hidden" value="/last/string/here" />

С List<string> следующим образом:

    [HttpPost]
    public ActionResult Move(List<string> entity)
    {
        return View(entity);
    }

Когда я публикую форму, представление отображает содержимое списка следующим образом:

        <%foreach (string item in Model)
          {%>

          <%: Html.Hidden("entity", item)%>
          <!--binding not working correctly -->

        <%} %>

И сгенерированное содержимое выглядит так:

<input id="entity" name="entity" type="hidden" value="/last/string/here" />
<input id="entity" name="entity" type="hidden" value="/last/string/here" />
<input id="entity" name="entity" type="hidden" value="/last/string/here" />

Я в замешательстве.Я попытался изменить исходное скрытое поле на это:

<input id="entity__" name="entity[]" type="hidden" value="/string/one/here" />
<input id="entity__" name="entity[]" type="hidden" value="/another/string/here" />
<input id="entity__" name="entity[]" type="hidden" value="/last/string/here" />

Но когда я попытался опубликовать это, я получил эту ошибку:

 System.NullReferenceException: Object reference not set to an instance of an object.

в этой строке кода в представлении:

<%foreach (string item in Model)

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

Спасибо

edit

В продолжении срока действия.Я отключил HtmlHelper и жестко запрограммировал скрытое поле внутри цикла foreach следующим образом:

<%foreach (string item in Model)
  {%>
      <input id="entity" name="entity" type="hidden" value="<%:item %>" />
<%} %>

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

<input id="entity" name="entity" type="hidden" value="//Content/files/NewDirectory/Aesculuparviflora011cm.jpg" />
<input id="entity" name="entity" type="hidden" value="//Content/files/NewDirectory/Aesculuparviflora011cm.jpg" />

Они идентичны.Но привязка работает, когда я жестко кодирую теги, и не работает, когда я использую помощник html.Что дает ?????????

Ответы [ 3 ]

1 голос
/ 19 января 2011

Почему вы используете циклы и не строго типизированные помощники в строго типизированном представлении? С шаблонами редактора все может быть так просто:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new[] 
        {
            "/string/one/here", "/another/string/here", "/last/string/here"    
        });
    }

    [HttpPost]
    public ActionResult Index(List<string> items)
    {
        return View(items);
    }
}

и соответствующий вид (~/Views/Home/Index.aspx):

<%@ Page 
    Title="" 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<string>>" %>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm()) { %>
        <%: Html.EditorForModel() %>
        <input type="submit" value="OK" />
    <% } %>
</asp:Content>

и соответствующий шаблон редактора (~/Views/Home/Index/EditorTemplates/string.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%: Html.HiddenFor(x => x) %>

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

0 голосов
/ 19 января 2011

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

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        var strings = new string[] { "test1", "test2", "test3" };

        return View(strings);
    }

    [HttpPost]
    public ActionResult Index(List<string> strings)
    {

        return View(strings);
    }

Страница aspx

       <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<string>>" %>
        <%using (Html.BeginForm()) { %>

        <% foreach (var item in Model) { %>

            <%:Html.Hidden("strings", item)%>   

        <% } %>

        <input type="submit" value="Submit" />
    <% } %>
0 голосов
/ 19 января 2011

попробовать:

<input id="entity" name="entity0" type="hidden" value="/last/string/here" /> 
<input id="entity" name="entity1" type="hidden" value="/last/string/here" /> 
<input id="entity" name="entity2" type="hidden" value="/last/string/here" /> 
...