传递给部分视图的模型在表单提交时为null

时间:2011-12-13 14:16:26

标签: asp.net-mvc asp.net-mvc-3 razor partial-views model-binding

我有以下型号:

@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。 问题是当我在HttpPost操作中收到SmartSEOModel时,SEOTemplateModel为null。好像通过将SEOTemplateModel复制到局部视图来传递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 :(得分:0)

因为您在部分视图中没有表单,所以它不会保留数据。尝试使用@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