Я обновляюсь с sitecore 7.2 до sitecore 8.1. У меня есть 5-летний опыт работы с веб-формами, но всего на несколько месяцев я был заинтересован в MVC. В дополнение к обновлению до 8.1 мой босс хочет перейти от веб-форм к MVC. У моей компании несколько сложная форма логики в Sitecore с Asp.Net Web Forms, где каждое поле формы является собственным Sublayout (User Control). Это позволяет редактору содержимого включать, а не включать и изменять порядок полей формы на основе требований, данных бизнесом. Вот как я сделать это в Web Forms (BTW мы также используем GlassMapper): Форма Markup фрагмент кода:Sitecore: преобразование динамических форм из веб-форм в MVC
<div id="formInputSection" runat="server">
<div id="fields">
<p class="required italic <%=reqFieldTextColor %>">
<sc:Text ID="formReqFields" Field="Required Fields Text" runat="server" ClientIDMode="Static" DataSource="<%#lpOptions.Paths.FullPath %>" />
</p>
<asp:UpdatePanel ID="formUpdatePanel" runat="server">
<ContentTemplate>
<asp:Panel ID="formPanel" runat="server">
<asp:ValidationSummary ID="valSumFormSubmit" runat="server" DisplayMode="BulletList" ValidationGroup="formSubmit" CssClass="errorMsg" />
<div>
<sc:Placeholder ID="FormFieldsSect" Key="v2_ph_form_fields_col1" runat="server" />
</div>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
</div>
<div id="form_action_submit" runat="server" class="form-action submit">
<asp:LinkButton ID="btnSubmitForm1" CssClass="form-input submit white" OnClientClick="ValidateAndDisableButton();" OnClick="submit_Click" UseSubmitBehavior="false" runat="server" ClientIDMode="Static" Text="<%#Model.Form_Submit_Text %>" ValidationGroup="formSubmit" />
<sc:Link ID="pgEditorFormSubmit1" Field="Editor Confirmation Link" CssClass="form-input submit white" runat="server" DataSource="<%#lpOptions.Paths.FullPath %>" Visible="false">
<sc:Text Field="Form Submit Text" ID="pgEditorSubmitText1" runat="server" ClientIDMode="Static" DataSource="<%#lpOptions.Paths.FullPath %>" Visible="false" />
</sc:Link>
</div>
Выше, является важной частью FormSublayout, которая включает в себя в UpdatePanel, который содержит заполнитель для отдельных подпалубных полей формы. Как вы можете видеть, у меня также есть динамическая валидация, основанная на том, какие поля вы добавляете в «v2_ph_form_fields_col1».
Следующая пометка для одного из основных подрайонов поля. Я буду использовать ПгвЬЫате ...
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FirstNameField.ascx.cs" Inherits="MyNamespace.FirstName" %>
<%@ Register TagPrefix="sc" Namespace="Sitecore.Web.UI.WebControls" Assembly="Sitecore.Kernel" %>
<div class="clearfix form-input field text <%=LabelStyle %>">
<asp:Label ID="Label1" AssociatedControlID="txtFirstName" Text="<%#Editable(x => x.First_Name) %>" runat="server" />
<asp:TextBox ID="txtFirstName" runat="server" ClientIDMode="Static" type="text"></asp:TextBox>
<asp:RequiredFieldValidator ID="validFirstName" runat="server" ControlToValidate="txtFirstName" ErrorMessage="<%#Model.First_Name_Required %>"
Enabled="true" ValidationGroup="formSubmit" Display="None"></asp:RequiredFieldValidator>
</div>
<br />
Это поле sublayout, как и все наши поля является стоять в одиночку. Он может быть добавлен к любой из наших форм и функции без ошибок. Кодекс Behind записывает свой вклад сессии и представить нам все значения в сессии и отобразить его на наш контактный объект, который будет наша модель в MVC ...
public partial class FirstName : InheritsFromGlassUserControl<FormFields>
{
protected override void Page_Load(object sender, EventArgs e)
{
if (this.Visible == true)
{
SitecoreContext context = new SitecoreContext();
Model = context.GetItem<FormFields>(Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource).ID.Guid);
//ls is an object that we grab from session to update and put back into session
//to handle cross user control communication and such
ls = GetSession();
LabelStyle = ls.MergeLabels ? "merge-label" : string.Empty;
if (!string.IsNullOrWhiteSpace(txtFirstName.Text))
{
ls.CurrentLead.FirstName = txtFirstName.Text;
}
else
{
if (!IsPostBack)
{
if (!string.IsNullOrWhiteSpace(ls.CurrentLead.FirstName) && !ls.IsReferralForm)
txtFirstName.Text = ls.CurrentLead.FirstName;
}
}
//Put updated values in "ls" back into session for the next field to update, with its input
SessionDetails = ls;
SetRenderingParameters();
}
this.DataBind();
}
}
вопрос у меня есть что было бы лучшим способом реализовать такое решение в MVC? У меня нет большого опыта работы в MVC, а не просто для создания неаккуратного решения, которое я хотел бы знать, если бы у кого-то был лучший пример практики того, как бы они (реализовали) автономные поля формы с учетом BeginForm () в сообщениях MVC к модели, но «модель» стекломастера несет ответственность за содержимое сообщения метки поля и поля, которое заполнено из файла sitecore. Мне не удалось заставить обе модели сосуществовать в одном файле cshtml. Я знаю, что это сложно, но концепция полей plug and play - очень ценное решение для бизнеса. И я понял, что работает для меня в Web Forms; просто имея проблемы, обволакивая мою голову, делая это в MVC.
Насколько сложна не ваши требования к форме? Вы считали, что вместо этого используете [Web Forms For Marketers module] (https://doc.sitecore.net/web_forms_for_marketers)? – jammykam
Они довольно сложны, но мы собираемся создать API для тяжелого подъема. Таким образом, наши формы будут отправлять данные в API и обновлять ExternalUser в sitecore, и API будет обрабатывать отправку контактной информации в Eloqua и наш CRM. Ожидается обновление до WFFM, и я жду этого, потому что каждый раз, когда они обновляют его, многие изменения касаются того, как материал ссылается на SC. И, начиная с 7.2 до 8.1, я уже знаю, что я собираюсь изучить новые соглашения об именах и местоположения для вещей. –
API также, вероятно, будет обрабатывать ситуации, в которых подана форма для регистрации вебинара, в этом случае он зарегистрирует контакт для веб-семинар Adobe или Citrix, одновременно отправляя Eloqua для подсчета очков и CRM для других целей. –