Динамически добавить элемент в коллекцию - PullRequest
1 голос
/ 02 июля 2011

У меня есть представление с добавлением элемента в коллекцию: он добавляет меня в html, но когда я вызываю ActionResult, Model.TagModelsis все еще пуст (при запуске пуст).

<div id="tags_div">
            <label id="add_tag">Hello</label>
            @foreach (var item in Model.TagModels)
            { 

                <div class="editor-field">
                    @Html.EditorFor(model => item.Name)
                    @Html.ValidationMessageFor(model => item.Name)
                </div>

            }</div>

        <script type="text/javascript">
            $(document).ready(function () {
                var $newdiv1 = $('<div class="ui-button-text"><input class="text-box single-line" id="item_Name" name="item.Name" type="text" value="b" /><span class="field-validation-valid" data-valmsg-for="item.Name" data-valmsg-replace="true"></span></div>');
                $("#add_tag").live("click", function () {
                    $(this).append($newdiv1);
                    return false;
                });
            });
        </script>

Вот мойviewmodel:

public class QuestionTagViewModel
    {
        public QuestionModel QuestionModel { get; set; }

        //private List<TagModel> _tagModels=new List<TagModel>(){new TagModel(){Name = "a"},new TagModel(){Name = "b"}};
        private List<TagModel> _tagModels = new List<TagModel>();

        public List<TagModel> TagModels
        {
            get { return _tagModels; }
            set { _tagModels = value; }
        }
    }

Почему нет обновления для модели?Когда я изменяю другие свойства для статических элементов, все в порядке

РЕДАКТИРОВАТЬ МХОЛЛИС:

Спасибо Антону за ваш ответ:)

Теперь у меня есть

<script type="text/javascript">
            $(document).ready(function () {
                $("#addItem").click(function () {
                    $.ajax({
                        url: this.href,
                        cache: false,
                        success: function (html) { $("#tags_div").append(html); }
                    });
                    return false;
                });
            });
        </script>

И tags_div:

<div id="tags_div">
            <label id="add_tag">Hello</label>
            @Html.ActionLink("Add another...", "BlankEditorRow", null, new { id = "addItem" })

            @foreach (var item in Model.TagModels)
            { 

                <div class="editor-field">
                    @Html.EditorFor(model => item.Name)
                </div>

            }</div>

И что метод PartialViewResult:

public PartialViewResult BlankEditorRow()
        {
            var x=PartialView("TagRow", new TagModel());
            return x;
        }

и частичное представление:

@*@using Szamam.Models
@model TagModel

<div class="editor-field">
    @Html.EditorFor(model => model.Name)
    @Html.ValidationMessageFor(model => model.Name)
</div>*@


<div class="editor-field">
<input class="text-box single-line" id="[0].Name"  name="[0].Name" type="text" value="b" />
</div>

Элементдобавляется, но когда fie actionresult, коллекция пуста: /

Так что должна быть другая причина: /

1 Ответ

2 голосов
/ 02 июля 2011

Это потому, что входы, которые вы добавляете через javascript, имеют идентификатор "item_name" и имя "item.name".У них должно быть имя «TagModels [0] .Name», «TagModels [1] .Name», «TagModel [2] .Name».Примечание: Это не соответствует информации, найденной здесь

ОБНОВЛЕНИЕ

Хорошо, поэтому я продолжил и нашел время, чтобы выполнить эту работу, учитываяданные, которые вы предоставили.К счастью, мне нужно нечто подобное для проекта, над которым я сейчас работаю, к сожалению, мой проект находится на VB.Net, но, чтобы помочь вам, я сделал этот код на C # (очевидно).Примечание: этот код вы можете скопировать и вставить в чистый проект, за исключением отсутствия использования операторов.

Представление

@model MvcApplication1.Models.QuestionTagViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <script src="../../Scripts/jquery-1.5.1.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery-ui-1.8.11.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery.validate.unobtrusive.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function() {
            var re = /\[(.*?)\]/ ;
            $("#add_tag").click(function() {
                var name = $(".tagRows:last>input").attr("name");
                var m = re.exec(name);
                var itemNumber = parseInt(m[1]) + 1;
                var $newdiv1 = $('<div class="tagRows"><input class="text-box single-line" id="TagModels' + itemNumber + '__Name" name="TagModels[' + itemNumber + '].Name" type="text"><span class="field-validation-valid" data-valmsg-for="TagModels[' + itemNumber + '].Name" data-valmsg-replace="true"></span></div>');
                $(".tagRows:last").after($newdiv1);
                return false;
            });
        });
    </script>
    <title>TagsTest</title>
</head>
<body>
    @using (Html.BeginForm())
    { 
        <div id="tags_div">
            <label id="add_tag">
                Hello</label>
            @for (int i = 0; i < Model.TagModels.Count; i++)
            {
                <div class="tagRows">
                    @Html.EditorFor(model => model.TagModels[i].Name)
                    @Html.ValidationMessageFor(model => model.TagModels[i].Name)
                </div>
            }
        </div>
        <input type="submit" name="submit" value="Submit" />
    }
</body>
</html>

Модель

namespace MvcApplication1.Models
{
    public class QuestionTagViewModel
    {

        //private List<TagModel> _tagModels=new List<TagModel>(){new TagModel(){Name = "a"},new TagModel(){Name = "b"}};
        private List<TagModel> _tagModels = new List<TagModel>();

        public List<TagModel> TagModels
        {
            get { return _tagModels; }
            set { _tagModels = value; }
        }
    }

    public class TagModel
    {
        public string Name { get; set; }
    }
}

Контроллер

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {

        public ActionResult TagsTest()
        {
            var tagmodels = new List<TagModel>();
            tagmodels.Add(new TagModel() { Name = "Tag1" });
            tagmodels.Add(new TagModel() { Name = "Tag2" });
            tagmodels.Add(new TagModel() { Name = "Tag3" });
            var model = new QuestionTagViewModel() { TagModels = tagmodels };


            return View(model);
        }

        [HttpPost]
        public ActionResult TagsTest(QuestionTagViewModel model)
        {
            return null;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...