asp.net mvc и модель связывания объектов с подобъектами - PullRequest
0 голосов
/ 27 ноября 2009

Я пытаюсь связать модель подклассом в форме.

У меня есть класс Page со связанным классом PageContent. В объекте Page есть много объектов PageContent. т.е. Page.PageContents

Я возвращаю Page в качестве Модели и вижу все элементы PageContent.

Однако я немного размыт о том, как назначать элементы PageContent для формы, чтобы она сохраняла привязку модели.

Когда я отправляю модель страницы обратно в контроллер, список PageContent становится пустым.

Вот фрагмент кода:

<% using (Html.BeginForm("SavePage", "Admin")) {%>

    <fieldset>
        <legend>Fields</legend>
        <%=Html.Hidden("PageId", Model.PageId) %>
        <p>
            <label for="Title">Title:</label>
            <%= Html.TextBox("Title", Model.Title) %>
            <%= Html.ValidationMessage("Title", "*") %>
        </p>
        <p>
            <label for="SysName">SysName:</label>
            <%= Html.TextBox("SysName", Model.SysName) %>
            <%= Html.ValidationMessage("SysName", "*") %>
        </p>

        <% 
            int i = 0;
       foreach (var pageContent in Model.PageContents)

           { %>
            <div>
                <%=Html.Hidden("PageContents[" + i + "].PageContentId", pageContent.PageContentId) %>
                <%=Html.TextArea("PageContents[" + i + "].Content", pageContent.Content)%>                
            </div>
        <%
            i++;
       } %>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

Мне кажется, я неправильно указал аспект PageContents формы.

EDIT: Вот основной метод контроллера, который я POST:

public ActionResult SavePage(Page page)
    {
        // do stuff with page.PageContents
        return View("PageEdit", page);
    }

Я не использую стиль Request.Form

Пожалуйста, помогите: D

1 Ответ

1 голос
/ 27 ноября 2009

Вы сказали, что Page.PageContents - это EntitySet<PageContent> и что вы используете автоматически сгенерированные классы. Итак, я полагаю, вы используете LINQ to SQL? Если это так, то вы можете использовать partial классы для добавления свойств к сгенерированному классу

Я помню, что у меня была похожая проблема, я не смог связать с EntitySet<T> свойствами. Я думаю, что я исправил это, используя свойство proxy / placeholder, которое было IList<T>, которое эффективно устанавливало фактическое свойство. Итак, в вашем случае это будет выглядеть примерно так:

// Your partial class, adding a property to the generated class
public partial class Page
{
    // Bind to this property
    public IList<PageContent> MyPageContents
    {
        set 
        { 
            var set = new EntitySet<PageContent>();
            set.AddRange(value);
            PageContents = set; 
        }
        get  { return PageContents; }
    }
}

// This and probably a lot more is created by LINQ to SQL
public partial class Page {
    // ...

    public EntitySet<PageContent> PageContents
    {
        get;
        set;
    }

    // ...
}

Я думаю, partial классы должны находиться в том же пространстве имен, что и автоматически сгенерированный класс. Дополнительная информация здесь: Добавление новых методов в классы, сгенерированные LINQ to SQL

А затем в своей форме вы связываетесь с MyPageContents (вы можете использовать более подходящее имя) вместо PageContents.

Надеюсь, это работает для вас, это было довольно давно, с тех пор как я в последний раз использовал LINQ to SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...