نموذج ملزم مع نماذج الطفل المتداخلة وPartialViews في ASP.NET MVC
-
20-09-2019 - |
سؤال
ولدي أنواع وفئات التالية:
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);
}
}