نموذج ملزم مع نماذج الطفل المتداخلة وPartialViews في ASP.NET MVC

StackOverflow https://stackoverflow.com/questions/2462506

سؤال

ولدي أنواع وفئات التالية:

namespace MVC.Models

public class Page 
{
   public EditableContent Content {get; set; }
}

public class EditableContent
{
    public TemplateSection SidebarLeft {get; set; }
    public TemplateSection SidebarRight {get; set; }
}

وأريد لتحرير المثال Page في بلدي Edit.aspx عرض. لأن تعلق EditableContent أيضا إلى نماذج أخرى، ولدي PartialView دعا ContentEditor.ascx التي يتم كتابتها بقوة ويأخذ مثيل EditableContent ويجعلها.

والجزء تقديم كل يعمل على ما يرام، ولكن عندما والرد على - كل شيء داخل بلدي ContentEditor لا binded - وهو ما يعني أن Page.Content هو null

وعلى PartialView، يمكنني استخدام كتابة بشدة الاكواد المساعدون للقيام بذلك:

<%= Html.HiddenFor(m => m.TemplateId) %>

ولكن لأن عناصر الإدخال على النموذج التي يتم تقديمها من قبل ContentEditor.ascx لا تحصل على بادئة Content إلى السمة id لها - لا binded القيم إلى Page

وحاولت استخدام المساعدين كتبته فضفاضة للتغلب على هذا:

<%= Html.Hidden("Content.TemplateId", Model.TemplateId) %>

وعندما أتعامل مع خاصية هذا هو List<T> شيء يحصل قبيحة جدا. وبعد ذلك يجب أن تجعل الفهارس جمع يدويا.

يجب أن أضع كل من صفحة وEditableContent كمعلمات للعمل تحكم:؟

public ActionResult Edit(Page page, EditableContent content) { ... }

وماذا أنا في عداد المفقودين؟

هل كانت مفيدة؟

المحلول

وأود أن أقترح عليك استخدام المساعد EditorFor

ونموذج:

public class EditableContent
{
    public string SidebarLeft { get; set; }
    public string SidebarRight { get; set; }
}

public class Page
{
    public EditableContent Content { get; set; }
}

المشاهدات / الرئيسية / Index.aspx:

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

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) { %>
    <%-- 
    This is the important part: It will look for 
    Views/Shared/EditorTemplates/EditableContent.ascx
    and render it. You could also specify a prefix
    --%>
    <%= Html.EditorFor(page => page.Content, "Content") %>
    <input type="submit" value="create" />
<% } %>
</asp:Content>

ومشاهدة / المشتركة / EditorTemplates / EditableContent.ascx:

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

<%= Html.TextBoxFor(m => m.SidebarLeft) %>
<br/>
<%= Html.TextBoxFor(m => m.SidebarRight) %>

وأخيرا المراقب / HomeController:

public class HomeController : Controller
{
    public ActionResult Edit()
    {
        var page = new Page
        {
            Content = new EditableContent
            {
                SidebarLeft = "left",
                SidebarRight = "right"
            }
        };
        return View(page);
    }

    [HttpPost]
    public ActionResult Edit(Page page)
    {
        return View(page);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top