Убедитесь, что у вас есть изменения кода в приложении, которое устанавливает время ожидания для вашего запроса и обрабатывает это.
Вы можете передать префикс для частичного использования с помощью
@Html.Partial("MyPartialView", Model.ComplexModel,
new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ComplexModel" }})
, который будет перенести префикс на ваш элемент управления атрибутом name
, чтобы <input name="Name" ../>
стал <input name="ComplexModel.Name" ../>
и правильно привязан к typeof MyViewModel
на обратной стороне
Изменить
Чтобы сделать это немного проще, вы можете инкапсулировать это в html-помощнике
public static MvcHtmlString PartialFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string partialViewName)
{
string name = ExpressionHelper.GetExpressionText(expression);
object model = ModelMetadata.FromLambdaExpression(expression, helper.ViewData).Model;
var viewData = new ViewDataDictionary(helper.ViewData)
{
TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = name }
};
return helper.Partial(partialViewName, model, viewData);
}
и использовать его как
@Html.PartialFor(m => m.ComplexModel, "MyPartialView")
Я столкнулся с одной и той же ситуацией, и с помощью таких информативных сообщений изменился мой неполный код, чтобы иметь префикс для сгенерированных в входных элементах, сгенерированных частичным представлением
. Я использовал Html.partial helper, дающий имя частичного просмотра и объект ModelType и экземпляр объекта ViewDataDictionary с префиксом поля Html для конструктора Html.partial.
Это приводит к запросу GET «xyz url» в «Main view» и отображению частичного представления внутри него с элементами ввода, сгенерированными с помощью префикса, например. ранее Name = «Title» теперь становится Name = «MySubType.Title» в соответствующем HTML-элементе и тем же для остальных элементов ввода формы.
Проблема возникла, когда запрос POST был сделан в «xyz url», ожидая, что заполненная форма будет сохранена в моей базе данных. Но MVC Modelbinder не привязывал мои данные модели POSTed с заполненными значениями форм, а также потерял ModelState. Модель в viewdata также достигла нулевого значения.
Наконец, я попытался обновить данные модели в форме «Отправлено», используя метод TryUppdateModel, который принимает экземпляр модели и html-префикс, который ранее был передан для частичного просмотра, и теперь можно увидеть модель привязан к значениям и состоянию модели.
Пожалуйста, дайте мне знать, подходит ли этот подход или бит разнообразен!
Вы можете попробовать передать ViewModel частичным.
@model my.path.to.namespace.MyViewModel
@Html.TextBoxFor(m => m.ComplexModel.Name)
Редактировать
Вы можете создать базовую модель и нажать там сложную модель и передать основанную модель на частичную.
public class MyViewModel :BaseModel
{
public string SomeProperty { get; set; }
}
public class MyViewModel2 :BaseModel
{
public string SomeProperty2 { get; set; }
}
public class BaseModel
{
public MyComplexModel ComplexModel { get; set; }
}
public class MyComplexModel
{
public int id { get; set; }
public string Name { get; set; }
...
}
Тогда ваше частичное будет выглядеть следующим образом:
@model my.path.to.namespace.BaseModel
@Html.TextBoxFor(m => m.ComplexModel.Name)
Если это не приемлемое решение, вам, возможно, придется подумать о переопределении связующего. Вы можете прочитать здесь здесь .
EditorFor()
с пользовательскимEditorTemplate
для вложенных моделей (а методEditorFor()
передаетHtmlFieldPrefix
в соответствии с приведенным выше кодом). Частицы не были предназначены для использования в этом сценарии, поэтому я предполагаю, что команда MVC не включила его) – Stephen Muecke 8 March 2016 в 13:21