具有Html.Checkboxfor lambda的Asp.Net Core MVC视图组件(替代模型)

时间:2018-09-15 20:12:29

标签: c# razor asp.net-core-mvc

我需要一种在视图组件中引用其他模型的方法,在该模型中我试图绑定HTML帮助对象(checkboxfor)。

@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”模型,而不是存在“ AutoUpdateProperty”的“ TenantSettingsModel”。

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

  

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

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

var result = Model.Result as TenantSettingsModel;

2 个答案:

答案 0 :(得分:1)

我认为,您应该将模型转换为控制器级别,并应直接返回模型

。 。 var tenantSettingViewModel = tableResult.Result作为TenantSettingsModel; 返回View(tenantSettingViewModel);

这样,您不必在View级别上强制转换对象,还可以直接将MVC的HtmlHelpers与模型一起使用。

答案 1 :(得分:0)

这里的答案有两个:

  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)