【问题标题】:Passing model between controller and multiple views在控制器和多个视图之间传递模型
【发布时间】:2021-02-15 07:43:35
【问题描述】:

我是 asp.net 的新手,遇到了一个非常基本的问题(在 c# 方面也没有太多经验,所以我可能误用了术语)。我有 2 个视图连接到同一模型。在第一个视图中,用户输入为模型属性之一分配了一个值——我们称之为 A1。在依赖于 A1 值的第二个视图中,用户输入填充了模型属性的其余部分,如下例所示。

控制器看起来像这样:

    public ActionResult ClalledFromView1(MyModel model)
    {
        return View("View2", model);
    }

    public ActionResult CalledFromView2(MyModel model)
    {
        model.CheckAllAttributes();
        return View("View3");
    }

View1 看起来像这样:

<html>
    @using (Html.BeginForm("CalledFromView1", "ControllerName", FormMethod.Post))
    {
        @Html.TextBoxFor(model => model.A1)
        <button type="submit">Submit</button>
    }
</html>

视图 2 看起来像这样:

<html>
    @using (Html.BeginForm("CalledFromView2", "ControllerName", FormMethod.Post))
    {
        @if (Model.A1 == "some value")
        {
            @Html.TextBoxFor(model => model.A2)
        }
        else
        {
            @Html.TextBoxFor(model => model.A3)
        }
        <button type="submit">Submit</button>
    }
</html>

发生的情况是,在调用 CalledFromView2 时,A1 为空,但 A2 已填充,并且与 A1 的原始值一致。我希望在控制器和两个视图之间来回传递相同的模型而不清除任何属性。 TIA。

【问题讨论】:

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


    【解决方案1】:

    如果你想保持 A1 值通过,你可以像这样添加一个隐藏的输入。

    视图2:

     @using (Html.BeginForm("CalledFromView2", "ControllerName", FormMethod.Post))
        {
            @Html.TextBoxFor(model => model.A1, new { @hidden = "hidden" })
            @if (Model.A1 == "some value")
            {
                @Html.TextBoxFor(model => model.A2)
            }
            else
            {
                @Html.TextBoxFor(model => model.A3)
            }
            <button type="submit">Submit</button>
        }
    

    这是一个演示:

    型号:

    public class ModelA
        {
            public string A1 { get; set; }
            public string A2 { get; set; }
            public string A3 { get; set; }
    
    
        }
    

    控制器(Test3):

    public IActionResult TestModelA()
            {
                return View();
            }
            public ActionResult CalledFromView1(ModelA model)
            {
                return View("View2", model);
            }
    
            public ActionResult CalledFromView2(ModelA model)
            {
                //model.CheckAllAttributes();
                return View("View3");
            }
    

    测试模型A:

    @using (Html.BeginForm("CalledFromView1", "Test3", FormMethod.Post))
    {
        @Html.TextBoxFor(model => model.A1)
        <button type="submit">Submit</button>
    }
    

    视图2:

    @using (Html.BeginForm("CalledFromView2", "Test3", FormMethod.Post))
    {
        @Html.TextBoxFor(model => model.A1, new { @hidden = "hidden" })
        @if (Model.A1 == "some value")
        {
            @Html.TextBoxFor(model => model.A2)
        }
        else
        {
            @Html.TextBoxFor(model => model.A3)
        }
        <button type="submit">Submit</button>
    
    
    }
    

    结果:

    【讨论】:

    • 你的意思是你的 model.listOfEmptyObjs 是一个列表有一些空对象?如果是这样,你不能用列表绑定文本框。列表需要是 foreach 并绑定数据。你需要更改名称textbox..net core 绑定数据和name属性。并且list需要绑定name喜欢listOfEmptyObjs[index].property。你最好开一个新的issue,并添加更多的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    相关资源
    最近更新 更多