Унаследованное свойство интерфейса не обнаружено привязкой модели в MVC3, но отлично работает в MVC2.

ОБНОВЛЕНИЕ: проблема решена.

Ответ Дарина Димитрова содержит ссылку на другой, связанный с этим вопрос. Одно из предложенных решений на этой странице в итоге сработало для нас.


Исходный вопрос

Пример кода ниже работает в MVC 2, но вызывает исключение в MVC 3. Кто-нибудь знает, почему MVC 3 внесло это критическое изменение? Есть ли способ заставить это работать в MVC 3, при этом позволяя мне описывать модель представления как интерфейс изнутри представления?

Есть еще один связанный с вопрос по StackOverflow, но он не дает мне любую информацию о том, почему существует разница между MVC 2 и MVC 3.

Модель

public interface IPerson {
    string Name { get; set; }
}

public interface ISpy : IPerson {
    string CodeName { get; set; }
}

public class Spy : ISpy {
    public string Name { get; set; }
    public string CodeName { get; set; }
}

Действие контроллера

public ActionResult Index() {
    var model = new Spy { Name = "James Bond", CodeName = "007" };
    return View(model);
}

Представление MVC2 (отлично работает)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

CodeName: <%: Html.TextBoxFor(x => x.CodeName) %>

Name: <%: Html.TextBoxFor(x => x.Name) %>

Представление MVC3 (Выдает исключение)

@model MvcApp.Models.ISpy

Name: @Html.TextBoxFor(x => x.Name)

CodeName: @Html.TextBoxFor(x => x.CodeName)


Информация об исключении MVC3

Ниже я показываю соответствующую информацию об исключении, но вы можете просмотреть весь вывод страницы с ошибкой здесь: https://gist.github.com/1443750 .

Runtime Exception
System.ArgumentException: The property **`MvcApp.Models.ISpy.Name`** could not be found.

Source Error:

Line 1:  @model MvcApp.Models.ISpy
Line 2:  

CodeName: @Html.TextBoxFor(x => x.CodeName)

Line 3:

Name: @Html.TextBoxFor(x => x.Name)

Stack Trace: [ArgumentException: The property MvcApp.Models.ISpy.Name could not be found.] System.Web.Mvc.AssociatedMetadataProvider.GetMetadataForProperty(Func`1 modelAccessor, Type containerType, String propertyName) +502169 System.Web.Mvc.ModelMetadata.GetMetadataFromProvider(Func`1 modelAccessor, Type modelType, String propertyName, Type containerType) +101 System.Web.Mvc.ModelMetadata.FromLambdaExpression(Expression`1 expression, ViewDataDictionary`1 viewData) +421 System.Web.Mvc.Html.InputExtensions.TextBoxFor(HtmlHelper`1 htmlHelper, Expression`1 expression, IDictionary`2 htmlAttributes) +58 System.Web.Mvc.Html.InputExtensions.TextBoxFor(HtmlHelper`1 htmlHelper, Expression`1 expression) +50 ASP._Page_Views_Home_Index_cshtml.Execute() in c:\Projects\MvcApplication1\MvcApplication1\Views\Home\Index.cshtml:3

Помогите нам Дарин Димитров, ты наша единственная надежда.

10
задан Community 23 May 2017 в 12:24
поделиться