在视图组件或局部视图中使用表单

Posted

技术标签:

【中文标题】在视图组件或局部视图中使用表单【英文标题】:Use a form in a view component or a partial view 【发布时间】:2021-07-04 07:38:08 【问题描述】:

我正在使用 .net 核心框架和没有 MVC 的剃须刀页面,我正在尝试将表单与视图组件集成以使其可重用。

问题是我注意到它并不是真正适合的。事实上,我使用表单的 asp-for 属性,该属性实际上是基于父 PageModel 我在其中绑定了与我的表单字段相对应的属性。

我想知道如何创建包含要在最终 PageModel 中使用的表单的可重用组件。

谢谢你:)

【问题讨论】:

所有 Web 框架都将标准 html、CSS、javascript 和 WASM 推送到浏览器。没有理由不能创建普通的旧输入元素并将表单发布到控制器。 Controller 的模型绑定器将尝试使用这些字段,或者您也可以将数据作为表单值访问。 准确地说,数据绑定到父控制器而不是视图组件;这就是问题所在,我希望我有一个解决方法 为了更清楚,我只想能够通过 [BindProperty] 将视图组件内表单的 asp-for 属性绑定到父类 ModelPage 的属性我开始找到一个追踪here但不是很清楚 【参考方案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

索引.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" />

然后可以在Partial视图中获取相关模型数据:

@model tr4cks491.Models.MyViewModel
<form method="post">
    <input asp-for="Job.Name" />
    <input asp-for="Profile.Name" />
    <input type="submit" value="Submit" />
</form>

【讨论】:

确实有效。事实上,我试图直接传递一个字符串并且不能。我是这个框架的新手,所以我仍然对一些原则感到困惑。但是如果你想对视图组件做同样的事情,我建议你阅读这个article,因为当你在同一个页面中使用多个组件时会发生冲突。

以上是关于在视图组件或局部视图中使用表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET CORE Razor Pages 中创建共享表单?

局部视图表单上的 HiddenFor 不包含任何元素

视图组件

如何正确使用带有 Ajax Begin 表单的局部视图

动态局部视图 + jquery 表单劫持 + 客户端验证 = 不工作

在剑道窗口内时,局部视图中的 MVC4 Ajax 表单返回整个页面