Asp.Net 核心 MVC 视图组件,带有 Html.Checkboxfor lambda(覆盖模型)



我需要一种方法在我的视图组件中引用不同的模型,我正在尝试绑定一个 Html 帮助程序对象(复选框)。

@model Microsoft.WindowsAzure.Storage.Table.TableResult
@{ 
var result = Model.Result as TenantSettingsModel;
}
<form asp-controller="Settings" asp-action="SaveSettings" method="post">
<table border="0">
<tr>
<td><label for=@result.PartitionKey>Your API Key: </label> </td>
<td>@result.PartitionKey</td>
</tr>
<tr>
<td><label for=@result.RowKey>Domain Name: </label></td>
<td>@result.RowKey</td>
</tr>
<tr>
<td><label for="@result.AutoUpdateNodes">Auto Update Nodes: </label> 
</td>
<td>@Html.CheckBoxFor(m => m.AutoUpdateNodes)</td>
</tr>

MVC 认为我的 lambda 表达式指的是我的"TableResult"模型,而不是我的"自动更新属性"所在的"租户设置模型"。

编辑:如果我在控制器中将 TableResult 转换为 TenantSettingsModel,然后在视图中删除我的模型语句,则会收到 MVC 运行时错误,指出以下内容:

InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为"Microsoft.WindowsAzure.Storage.Table.TableResult",但此 ViewDataDictionary 实例需要类型为"TeamsAnalyzer.Models.TenantSettingsModel"的模型项。

这就是为什么我的视图具有以下代码:

var result = Model.Result as TenantSettingsModel;

在我看来,您应该在控制器级别转换模型,该模型应直接返回模型,

. . var tenantSettingViewModel = tableResult.Result as TenantSettingsModel; 返回视图(租户设置视图模型);

这样,您就不必在视图级别强制转换对象,还可以直接将MVC的HtmlHelpers与模型结合使用。

这里的答案是双重的:

  1. 我需要在控制器中将 TableResult.Result 转换为 TenantSettingsModel,如下所示:

    TableResult retrievedResult = await tableName.ExecuteAsync(retrieveOperation);
    return View(retrievedResult.Result as TenantSettingsModel);
    
  2. 我需要在视图组件视图中删除对 TableResult 的@model引用,并将其替换为正确的引用,如下所示:

    @model TeamsAnalyzer.Models.TenantSettingsModel
    

然后,我可以按如下方式设置我的 lambda 表达式:

@Html.CheckBoxFor(m => m.AutoUpdateNodes)

最新更新