将 viewModel 的一部分发布到 post action 方法

Ada*_*iak 1 c# asp.net-mvc

我想知道我是否做错了什么,或者无法使用默认模型绑定器仅发布视图模型的一部分。假设我有一个复杂的视图模型,只应发布其中的一小部分。我想实现这样的目标:

public class ComplexViewModel
{
    public object FirstNotPostedData { get; set; }
    public object SecondNotPostedData { get; set; }
    //......
    public object NthNotPostedData { get; set; }

    public InnerModelToPost InnerModelToPost { get; set; }
}

public class InnerModelToPost
{
    public string FirstProperty { get; set; }
    public string SecondProperty { get; set; }
    public string ThirdProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

鉴于我想显示模型的一部分并发布另一部分:

@model ComplexViewModel
@* DISPLAYING DATA *@
<form>
    @Html.HiddenFor( m => m.InnerModelToPost.FirstProperty )
    @Html.HiddenFor( m => m.InnerModelToPost.SecondProperty )
    @Html.HiddenFor( m => m.InnerModelToPost.ThirdProperty )

    <button type="submit">Submit button</button>
</form>
Run Code Online (Sandbox Code Playgroud)

然后我希望能够使用默认模型绑定器以这种方式将此模型传递到我的控制器:

public ActionResult GetOnlyImportantPartOfModel( InnerModelToPost innermodel)
{
    //I'm getting empty model when I' doing like this

    return View();
}
Run Code Online (Sandbox Code Playgroud)

您可能会问为什么不将整个模型作为参数传递给此操作方法。所以答案是:代码可读性。我将 ComplexViewModel 存储在会话中,并在操作方法的第一行中读取它。我只想传递我想要用来更新模型的数据。

小智 5

您需要使用attributePrefix的属性从表单值中[Bind]去除前缀​​。InnerModelToPost

public ActionResult GetOnlyImportantPartOfModel([Bind(Prefix = "InnerModelToPost")] InnerModelToPost innermodel)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果您只使用 的属性,那么在 GET 方法中,您可以从InnerModelToPost读取父类 ( ) ,但仅将属性传递给视图ComplexViewModelSessionInnerModelToPost