MVC Razor - 将模型值设置为其他模型值?

时间:2017-03-16 12:52:36

标签: asp.net-mvc asp.net-mvc-4 razor

我在视图中有2个模型。我希望能够在通过for循环时将模型的一个属性的值设置为另一个模型属性。示例代码澄清:

@model xxx.Models.modelbundle

@using (Html.BeginForm("Post", "Admin", FormMethod.Post))
{

    for (int item = 0; Model.One.Count > item; item++)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => Model.One[item].ObjectId)
            </td>
            <td>
                @Html.CheckBoxFor(modelItem => Model.Two[item].set)
            </td>


           @Model.Two[item].ObjectId = Model.One[item].ObjectId; // Here. How to set them?


        </tr>

                }


    <div>
        <input type="submit" id="button" value="Change Me" href="/Admin">

        <div></div>
    </div>
}

编辑:

ObjectId不会传递给Model.Two。例如

        [HttpPost]
    public ActionResult Post(modelbundle model)
    {
        List<Two> list = model.Two; // Model bundle contains a list. Eg. model.Two[0].ObjectId = null
      ...
}

Model-Two(Inside modelbundle):

public class 
{
    public bool get { get; set; }
    public bool list { get; set; }
    public bool set { get; set; }
    public bool delete { get; set; }
    public bool all { get; set; }
    public string ObjectId { get; set; }
    public string displayName { get; set; }
}

在大卫的帮助下 - 这对我有用。我知道它可以在没有蓝色/黄色变量的情况下完成,但它让我更容易阅读:

 @{
                var yellow = Model.One[item].DisplayName;
                Model.Two[item].displayName = yellow;

                var blue = Model.One[item].ObjectId;
                Model.Two[item].ObjectId = blue;

            }
                @Html.HiddenFor(modelItem => Model.Two[item].displayName);
                @Html.HiddenFor(modelItem => Model.Two[item].ObjectId);

1 个答案:

答案 0 :(得分:1)

在此控制器操作中:

[HttpPost]
public ActionResult Post(modelbundle model)
{
    //...
}

model变量具有客户端页面发送的内容。而已。因此,例如,此客户端输入正在为此属性发送值:

@Html.CheckBoxFor(modelItem => Model.Two[item].set)

但是,这根本不会创建任何类型的客户端标记:

@Model.Two[item].ObjectId = Model.One[item].ObjectId;

该行所做的就是在传递给视图的模型实例上设置一个属性。如果在渲染视图时从不使用该属性,那么一旦视图完成构建并且该模型的实例超出范围,它就会丢失。

在结构上,概念与此类似:

void Method1()
{
    var something = new SomeObject();
    Method2(something);
}

void Method2(SomeObject obj)
{
    obj.SomeProperty = "some value";
}

该属性已成功设置,但只要Method1()完成执行就会丢失,因为没有使用它。那个例子超出了范围,现在已经消失了。当您稍后创建SomeObject的新实例时(因为模型绑定器在从客户端接收请求时在ASP.NET中执行),该 new 实例将不会进行更改你做了以前的实例。

循环回您的Web应用程序...为了将该值包含在发布回服务器的内容中,该值将需要包含在发布的表单中。像这样:

@Html.HiddenFor(modelItem => Model.Two[item].ObjectId)

这将呈现<input type="hidden" />,其中包含要与表单一起发布的值。请注意,由于此值将来自客户端,因此用户可以编辑该值。