Используйте форму в компоненте представления или в частичном представлении

Я использую базовую структуру .net со страницами razor без MVC, и я пытаюсь интегрировать форму с компонентом представления, чтобы сделать ее многоразовой.

Проблема в том, что я заметил, что это не совсем для. На самом деле я использую атрибут asp-for формы, который на самом деле основан на родительской PageModel, в которой я привязал атрибут, соответствующий полю моей формы.

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

Спасибо :)


person tr4cks    schedule 08.04.2021    source источник
comment
Все веб-фреймворки передают в браузер стандартные HTML, CSS, Javascript и WASM. Нет причин, по которым вы не можете создавать простые старые элементы ввода и отправлять форму в контроллер. Связыватель модели контроллера попытается использовать эти поля, или вы также можете получить доступ к данным как значениям формы.   -  person Crowcoder    schedule 08.04.2021
comment
Точно данные привязаны к родительскому контроллеру, а не к компоненту представления; это проблема, и мне жаль, что у меня не было обходного пути, я думаю, что вы не должны использовать атрибут asp-for и, следовательно, получать данные в качестве параметра, но документация не очень информативна по этому вопросу   -  person tr4cks    schedule 09.04.2021
comment
Чтобы быть более ясным, я просто хочу иметь возможность привязать атрибут asp-for формы внутри компонента представления к атрибуту родительского класса ModelPage через [BindProperty]. Я начал находить дорожку здесь, но это не очень понятно   -  person tr4cks    schedule 09.04.2021


Ответы (1)


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

Вы хотите использовать частичное представление и получать данные из разных моделей?

Затем вы можете использовать ViewModel, чтобы содержать несколько разных моделей, например:

public class MyViewModel
{
    public Profile Profile { get; set; }
    public Job Job { get; set; }
}
public class Profile
{      
    public string Name { get; set; }
}
//....other models

Index.cshtml.cs:

[BindProperty]
    public MyViewModel MyViewModel { get; set; }

    public void OnGet()
    {
        MyViewModel = new MyViewModel
        {
            Job = new Job { Name = "teacher" },
            Profile=new Profile {Name="Peter"}          
        };
    }

Index.cshtml (model = используется для передачи модели в частичную):

<partial name="~/Pages/Shared/Partialview.cshtml" model="Model.MyViewModel" />

Затем вы можете получить данные связанной модели в частичном представлении:

@model tr4cks491.Models.MyViewModel
<form method="post">
    <input asp-for="Job.Name" />
    <input asp-for="Profile.Name" />
    <input type="submit" value="Submit" />
</form>
person Jerry Cai    schedule 09.04.2021
comment
Действительно работает. На самом деле я пытался передать строку напрямую и не смог. Я новичок в этой структуре, поэтому я все еще не понимаю некоторых принципов. Но если вы хотите сделать то же самое для компонентов представления, я советую вам прочитать это article, потому что при использовании нескольких компонентов на одной странице возникают конфликты. - person tr4cks; 11.04.2021