Модель, переданная в частичное представление, не имеет значения при отправке формы - PullRequest
1 голос
/ 13 декабря 2011

У меня есть следующая модель:

@model SmartSEOModel

public class SmartSEOModel
{
    public SmartSEOSettingsModel SmartSEOSettingsModel { get; set; }

    public SEOTemplateModel SEOTemplateModel { get; set; }
}

На мой взгляд, у меня есть частичное представление, которое я называю так:

@using (Html.BeginForm())
{
    some razor code here

    <div id="pnlSmartSEO">

        @Html.Partial(ViewNames.SmartSEOController_SEOTemplate, Model.SEOTemplateModel)

    </div>
}

В частичном представлении есть некоторые поля формыпривязан к SEOTemplateModel.Проблема заключается в том, что когда я получаю SmartSEOModel в своем действии HttpPost, SEOTemplateModel имеет значение null.Как будто SEOTemplateModel был передан путем копирования его в частичное представление.

Пожалуйста, сообщите, почему это так и как обойти это.

Большое спасибо

Мой частичный вид выглядитвот так:

@Html.Telerik().TabStrip().Name("SmartSEO").Items(x =>
{
    x.Add().Text(T("Admin.SmartSEO").Text).Content(GetSmartSEOUI().ToHtmlString()).Selected(true);
})

@helper GetSmartSEOUI()
{
@(Html.LocalizedEditor<SEOTemplateModel, SEOTemplateLocalizedModel>("SmartSEO-Localized",
    @<table class="adminContent">
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.Locales[item].CategoryTitleSEOTemplate):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.Locales[item].CategoryTitleSEOTemplate)
            </td>
        </tr>
    </table>,
    @<table class="adminContent">
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.CategoryTitleSEOTemplate):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.CategoryTitleSEOTemplate)
            </td>
        </tr>
    </table>
))
}

Мое действие HttpPost выглядит так:

[HttpPost]
    public ActionResult Configure(SmartSEOModel smartSEOModel)
    {
        var seoTemplate = SEOTemplateService.GetSEOTemplateById(smartSEOModel.SEOTemplateModel.Id);

        if(seoTemplate == null)
        {
            throw new ArgumentException(String.Format("No SEOTemplate found with Id {0}", smartSEOModel.SEOTemplateModel.Id));
        }

        if (!ModelState.IsValid)
        {
            RedirectToAction("Configure");
        }

        SettingService.SaveSetting(smartSEOModel.SmartSEOSettingsModel.ToEntity());
        seoTemplate = smartSEOModel.SEOTemplateModel.ToEntity(seoTemplate);
        SEOTemplateService.UpdateSEOTemplate(seoTemplate);
        UpdateLocales(seoTemplate, smartSEOModel.SEOTemplateModel);

        //activity log
        CustomerActivityService.InsertActivity("EditSEOTemplate", LocalizationService.GetResource("ActivityLog.EditSEOTemplate"));

        SuccessNotification(LocalizationService.GetResource("SevenSpikes.NopSmartSEO.Admin.SEOTemplate.Notifications.SEOTemplateEdited"));

        return View("SevenSpikes.Nop.Plugins.SmartSEO.Views.Configure", smartSEOModel);
    }

1 Ответ

0 голосов
/ 19 февраля 2014

Поскольку у вас нет формы в частичном представлении, она не сохранит данные.Попробуйте использовать @Html.EditorFor вместо @Html.Partial.

. Таким образом, ваш основной вид будет выглядеть как

@using (Html.BeginForm())
{
    some razor code here

    <div id="pnlSmartSEO">

        @Html.EditorFor(model => model.SEOTemplateModel)

    </div>
}

. Затем вам потребуется переместить частичное представление в шаблон.Переименуйте ваш частичный вид в EditorTemplates\SEOTemplateModel.cshtml и поместите его в то же место, где находится ваш основной вид.

Вам также понадобится сделать ваш шаблон строго набранным: @model [namespace].SEOTemplateModel

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