Динамическое добавление к модели страницы в форме с использованием частичного представления Razor

#.net #post #razor #dynamic #partial-views

#.net #Публикация #razor #динамический #частичные представления

Вопрос:

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

Этот код работает:

 <div class="row form-group">
    <div>
        <input type="submit" asp-page-handler="AddQuestion" class="btn btn-info" value="Add Question" />
    </div>
    <div class="form-group">
            @for (var i = 0; i < Model.SurveyObject.Questions.Count; i  )
            {
                <h4><span class="alert-info">Question ID# @Model.SurveyObject.Questions[i].QuestionId</span></h4>
                <span class="hidden">
                    @Html.LabelFor(x => Model.SurveyObject.Questions[i].QuestionId)
                    @Html.EditorFor(x => Model.SurveyObject.Questions[i].QuestionId)
                </span>
                @Html.LabelFor(x => Model.SurveyObject.Questions[i].Question)
                @Html.EditorFor(x => Model.SurveyObject.Questions[i].Question)
            }
    </div>
</div>
  

Но при преобразовании в частичное представление это не работает:

 <div class="row form-group">
    <div>
        <input type="submit" asp-page-handler="AddQuestion" class="btn btn-info" value="Add Question" />
    </div>
    <div class="form-group">
        @for (var i = 0; i < Model.SurveyObject.Questions.Count; i  )
        {
            @await Html.PartialAsync("_SurveyCreateQuestion", Model.SurveyObject.Questions[i]);
        }
    </div>
</div>
  

Вот вспомогательные объекты.

 public class Survey
{
    public string SurveyName { get; set; }
    public List<SurveyQuestion> Questions { get; set; }
    public Survey()
    {
        this.SurveyName = "new survey name here";
        this.Questions = new List<SurveyQuestion>();
    }
}
public class SurveyQuestion
{
    public int QuestionId { get; set; }
    public string Question { get; set; }
    public List<SurveyResponse> ResponseList { get; set; }
    public SurveyQuestion() { }
    public SurveyQuestion(int id)
    {
        this.QuestionId = id;
        this.Question = "question text for id "   id;
        this.ResponseList = new List<SurveyResponse>();
    }
}
public class SurveyResponse
{
    public int ResponseId { get; set; }
    public string Response { get; set; }
    public SurveyQuestion NextQuestion { get; set; }
    public SurveyResponse() { }
    public SurveyResponse(int id)
    {
        this.ResponseId = id;
        this.Response = "response text for id "   id;
    }
}
  

И вот файл cshml.

 public class SurveyCreateModel : PageModel
{
    [BindProperty]
    public Survey SurveyObject { get; set; }
    public void OnGet()
    {

    }
    public void OnPostAddQuestion()
    {
        this.SurveyObject.Questions.Add(new SurveyQuestion(this.SurveyObject.Questions.Count   1));
    }
}
  

И частичное представление.

 @model SurveyCreateModel.SurveyQuestion
@if (Model == null)
{
    <span></span>
}
else
{
    <h4><span class="alert-info">Question ID# @Model.QuestionId</span></h4>
    <span class="hidden">
        @Html.LabelFor(x => Model.QuestionId)
        @Html.EditorFor(x => Model.QuestionId)
    </span>
    @Html.LabelFor(x => Model.Question)
        @Html.EditorFor(x => Model.Question)
}
  

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

 <label for="SurveyObject_Questions_0__QuestionId">QuestionId</label>
<label for="SurveyObject_Questions_1__QuestionId">QuestionId</label>
  

Но когда тот же код для генерации тегов перемещается в частичное представление внутри того же цикла, html отображается следующим образом:

 <label for="QuestionId">QuestionId</label>
  

Печать экрана частичного просмотра не работает — продолжайте нажимать добавить вопрос, но всегда остается на первом вопросе — модель не обновляется

notwork

Распечатка рабочего кода — дважды нажмите кнопку добавить вопрос, и добавлено два вопроса — модель обновляется

работает

Комментарии:

1. пожалуйста, укажите, в чем проблема — частичное представление не отображается или входные данные не отправляются на сервер?

2. Добавлены экранные отпечатки, показывающие, что добавить вопрос работает и не работает.

3. Также добавлен визуализированный HTML как рабочих, так и нерабочих результатов.

Ответ №1:

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

 @model SurveyCreateModel.SurveyQuestion
<h4><span class="alert-info">Question ID# @Model.QuestionId</span></h4>
<span class="hidden">
    @Html.LabelFor(x => Model.QuestionId)
    @Html.EditorFor(x => Model.QuestionId)
</span>
@Html.LabelFor(x => Model.Question)
@Html.EditorFor(x => Model.Question)
  

Затем на этот код просто ссылались this в cshtml:

 <div class="form-group">
  @Html.EditorFor(x => x.SurveyObject.Questions)
</div>