Извлечение данных из частичного представления в основной вид [дубликат]

  1. Откройте терминал inAndroid Studio и перейдите к ../../Android/sdk/tools.
  2. Запустить ./emulator -netdelay "delay_in_millis" -avd "emulator_device_name" Пример: ./emulator -netdelay 60000 -avd Nexus_5_API_21
  3. Теперь выполните сборку ваше приложение и установите его в эмулятор.
  4. Запустите свой сценарий в приложении.

Убедитесь, что у вас есть изменения кода в приложении, которое устанавливает время ожидания для вашего запроса и обрабатывает это.

19
задан Blair Holmes 22 April 2015 в 21:49
поделиться

3 ответа

Вы можете передать префикс для частичного использования с помощью

@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")
28
ответ дан Stephen Muecke 15 August 2018 в 15:31
поделиться
  • 1
    это выглядит очень многообещающим. Я покинул офис в течение дня, но завтра дам ему снимок, когда я вернусь и помету как ответ, если он сработает для меня. Благодарю. – Blair Holmes 22 April 2015 в 22:41
  • 2
    это потрясающе!! большое спасибо. – Blair Holmes 23 April 2015 в 13:49
  • 3
    boo ... Я не могу выдвинуть его, потому что он говорит, что у меня должно быть 15 репутации. +1 для вас, хотя, как только я получу 15 репутации :) – Blair Holmes 23 April 2015 в 13:50
  • 4
    @Christian. Это уже так, потому что правильный подход заключается в использовании EditorFor() с пользовательским EditorTemplate для вложенных моделей (а метод EditorFor() передает HtmlFieldPrefix в соответствии с приведенным выше кодом). Частицы не были предназначены для использования в этом сценарии, поэтому я предполагаю, что команда MVC не включила его) – Stephen Muecke 8 March 2016 в 13:21
  • 5
    Использование EditorFor является «слишком условным». (строгие определения имен, структура папок) и, наконец, изменяет выходной html. Второе решение - передать родительскую модель, которая также является неправильным подходом, потому что она больше не используется повторно. – Cristian E. 8 March 2016 в 13:31

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

. Я использовал 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-префикс, который ранее был передан для частичного просмотра, и теперь можно увидеть модель привязан к значениям и состоянию модели.

Пожалуйста, дайте мне знать, подходит ли этот подход или бит разнообразен!

0
ответ дан Sachin Chauhan 15 August 2018 в 15:31
поделиться

Вы можете попробовать передать 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)

Если это не приемлемое решение, вам, возможно, придется подумать о переопределении связующего. Вы можете прочитать здесь здесь .

0
ответ дан Yogiraj 15 August 2018 в 15:31
поделиться
  • 1
    Я не могу этого сделать, потому что он должен быть общим. Будет несколько родительских ViewModels, у которых есть свой тип, который нужно будет передать ... См. Мое первое редактирование в OP. – Blair Holmes 22 April 2015 в 21:53
Другие вопросы по тегам:

Похожие вопросы: