加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 带继承的MVC Complex模型绑定,嵌套的viewModels和部分视图

发布时间:2020-12-16 00:25:04 所属栏目:百科 来源:网络整理
导读:我无法将嵌套模型的值恢复到控制器,它们都是空值. 这是简化的架构: //The viewModel being passed to the viewpublic class RunnerIndexViewModel{ public RegisterViewModel User { get; set; } public TrainerViewModel TrainerVM { get; set; } public R
我无法将嵌套模型的值恢复到控制器,它们都是空值.

这是简化的架构:

//The viewModel being passed to the view
public class RunnerIndexViewModel
{
    public RegisterViewModel User { get; set; }

    public TrainerViewModel TrainerVM { get; set; }

    public RunnerBase Runner { get; set; }

    [Display(Name = "AddContact",ResourceType = typeof(MyRessources))]
    public bool AddContact { get; set; }
}

public class RegisterViewModel
{
    // various simple type properties here
}

public class TrainerViewModel
{
    // various properties here
    public Unit unit { get; set; }

    public List<SelectListItem> ListStatut { get; set; }
}

public abstract partial class RunnerBase
{
    // entity framework class with associations
}

public class RedRunner : RunnerBase
{
    // entity framework class with associations
}

public class BlueRunner : RunnerBase
{
    // entity framework class with associations
}

以下是从控制器接收模型的主视图(简化):

@model Web.Models.Fournisseurs.FournisseurIndexViewModel

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    @Html.Partial("PartialTrainer",Model.TrainerVM)
    @Html.Partial("PartialRunner",Model.Runner as RedRunner)
    @Html.Partial("PartialUser",Model.User)
}

PartialTrainer和PartialUser的观点没什么特别之处,所以这里是从实体框架中获取基类的PartialRunner视图:

@model RunnerBase

@* Show Various fields from RunnerBase ... *@

@if (Model is RedRunner)
{
    @* show properties specific to RedRunner *@
}
else if (Model is BlueRunner)
{
    @* show properties specific to BlueRunner *@
}

从控制器我将RedRunner或BlueRunner传递给Runner属性.所有viewModel的所有字段都显示良好,但在提交表单时,我只设法获取AddContact值…

如何获取其他视图模型的值以及Runner类中的值?

解决方法

问题在于使用partials.每次进入部分时,模型上下文都会发生变化,因此Razor为您生成的输入不会考虑完整的属性路径.例如,如果要在主视图中执行以下操作:

@Html.EditorFor(m => m.TrainerVM.SomeProperty)

生成的HTML类似于:

<input type="text" name="TrainerVM.SomeProperty" />

但是,当使用partial时,您的助手将被称为:

@Html.EditorFor(m => m.SomeProperty)

生成的HTML将类似于:

<input type="text" name="SomeProperty" />

一旦将其发回,模型绑定器就不知道SomeProperty属于TrainerVM实例,因此它无法确定绑定发布值的位置,最终会出现空值.要继续使用partials而不是侧面解决此问题,您需要传递ViewData.TemplateInfo.HtmlFieldPrefix的值(用于正确添加部分中所有字段的名称):

@Html.Partial("PartialTrainer",Model.TrainerVM,new ViewDataDictionary(ViewData)
{
    TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "TrainerVM" }
})

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读