Исключение в @ Html.EditorFor в Umbraco 5 - PullRequest
2 голосов
/ 06 марта 2012

Я сделал электронную установку с Umbraco версии 5, и я делаю форму с Surface Controller. Я добавил форму в таком виде:

@inherits RenderViewPage
@using System.Web.Mvc.Html;
@using Umbraco.Cms.Web;
@using Umbraco.Cms.Web.Editors;
@{
    Layout = "Page.cshtml";
}

<section>
  @using (Html.BeginUmbracoForm("SendContactInfo", "ContactSurface"))
  {

      var contactForm = new ContactModel();


    @Html.ValidationSummary(prefix: "contactForm")

    @Html.EditorFor(x => contactForm)


    <input type="submit"  value="Send" />
  }
</section>

и контроллер:

public class ContactSurfaceController:SurfaceController
{
    [HttpPost]
    public ActionResult SendContactInfo(
        [Bind(Prefix = "contactForm")]
            ContactModel model)
    {
        if (!ModelState.IsValid)
        {
            return CurrentUmbracoPage();
        }


        return new JsonResult() { Data = new { Name = "Sucess!"} };
    }
}

И модель:

public class ContactModel
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    [Required]
    public string Email { get; set; }

    public string Message { get; set; }
}

И я получаю исключительную ссылку Null на @ Html.EditorFor (x => contactForm). Это стек транс:

[NullReferenceException: Object reference not set to an instance of an object.]


Umbraco.Framework.Localization.Web.Mvc.LocalizingModelMetadataProvider.GetConventionKeyNames(Type containerType, String propertyName, Boolean testSimplePropertyName) +285
   Umbraco.Framework.Localization.Web.Mvc.LocalizingModelMetadataProvider.CreateMetadata(IEnumerable`1 attributes, Type containerType, Func`1 modelAccessor, Type modelType, String propertyName) +597
   Umbraco.Cms.Web.Mvc.Metadata.UmbracoModelMetadataProvider.CreateMetadata(IEnumerable`1 attributes, Type containerType, Func`1 modelAccessor, Type modelType, String propertyName) +62
   System.Web.Mvc.AssociatedMetadataProvider.GetMetadataForProperty(Func`1 modelAccessor, Type containerType, PropertyDescriptor propertyDescriptor) +93
   System.Web.Mvc.<GetMetadataForPropertiesImpl>d__2.MoveNext() +226
   System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
   System.Linq.<GetEnumerator>d__0.MoveNext() +96
   System.Linq.WhereEnumerableIterator`1.MoveNext() +87
   System.Web.Mvc.Html.DefaultEditorTemplates.ObjectTemplate(HtmlHelper html, TemplateHelperDelegate templateHelper) +368
   System.Web.Mvc.Html.DefaultEditorTemplates.ObjectTemplate(HtmlHelper html) +47
   System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplate(HtmlHelper html, ViewDataDictionary viewData, String templateName, DataBoundControlMode mode, GetViewNamesDelegate getViewNames, GetDefaultActionsDelegate getDefaultActions) +714
   System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData, ExecuteTemplateDelegate executeTemplate) +1117
   System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData) +66
   System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData, TemplateHelperDelegate templateHelper) +117
   System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData) +100
   System.Web.Mvc.Html.EditorExtensions.EditorFor(HtmlHelper`1 html, Expression`1 expression) +56
   ASP._Page_Views_Umbraco_contact_cshtml.Execute() in e:\3fa4128e3b304b75b56af47f1ff5219e\Umbraco5-Smallsite\Views\Umbraco\contact.cshtml:17
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +207
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +81
   System.Web.WebPages.StartPage.RunPage() +19
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +65
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +220
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +303
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +23
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
   System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +260
   System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +177
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
   System.Web.Mvc.Controller.ExecuteCore() +116
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8969117
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184

Я боролся с этой ошибкой в ​​течение 4-5 часов, гуглял и пробовал разные вещи. Если у кого-то есть идея, как это исправить, я был бы очень признателен.

Обновление Я отправил весь код представления и контроллера для получения дополнительной информации.

Update-2 Добавлена ​​модель для дополнительной информации.

Update-3 Наконец, я использовал подход, предложенный в двух постах ниже. Проблема с этим подходом заключалась в том, что я добавил SurfaceController непосредственно на веб-сайте Umbraco вместо того, чтобы делать другой проект и ссылаться на него на веб-сайте Umbraco. Когда я создал отдельный проект - Controller Showed Up и все было хорошо. Я отмечаю пост, который позволил мне подумать, как правильный ответ.

Я не смог решить проблему, за исключением мысли о локализации Умбрако.

Вы можете найти исходный код этой темы в GitHub репозитории .

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Предполагая, что вы публикуете полный код своего представления, ваше представление не является строго типизированным и отсутствует модель, из-за которой EditorFor выдает исключение.Просто добавьте директиву модели к вашему представлению и из вашего контроллера вставьте объект в представление:

@model Site.Extensions.ViewModel.ContactViewModel

        [ChildActionOnly]
    public PartialViewResult ContactForm()
    {
        var model = new ContactViewModel();
        return PartialView(model);
    }
0 голосов
/ 06 марта 2012

Не уверен, почему провайдер метаданных локализации выдает исключение, можете ли вы опубликовать вашу модель, так как это, вероятно, будет причиной возникновения исключения.

В любом случае, вот пример, который работает:

public class MyLocalSurfaceController : SurfaceController
{

     public ActionResult HandleForm(
        [Bind(Prefix = "MyForm")]MyFunModel model)
    {
        if (!ModelState.IsValid)
        {
            return CurrentUmbracoPage();
        }

        return RedirectToCurrentUmbracoPage();
    }

    [ChildActionOnly]
    public PartialViewResult RenderForm(string name, int age)
    {
        return PartialView(new MyFunModel(){ Name = name, Age = age});
    }

}

И представление для рендеринга:

@model Umbraco.Cms.Web.UI.Models.MyFunModel

values passed in:
<p>
    Age: @Model.Age<br/>
    Name: @Model.Name
</p>

@using(Html.BeginUmbracoForm("HandleForm", "MyLocalSurface"))
{
    @Html.ValidationSummary(prefix: "MyForm")
    @Html.EditorFor(x => Model, "", "MyForm")
    <input type="submit" />
}

Ваш код, кажется, в порядке, поэтому я задаюсь вопросом о вашем классе Model. Кроме того, кажется очень странным, что вы возвращаете результат JSON, когда ваша форма успешна. Это означает, что ваш браузер будет просто отображать JSON, точно уверен, что это не то, что вы намереваетесь?

...